/** @license Hyphenator X.Y.Z - client side hyphenation for webbrowsers
 *  Copyright (C) 2010  Mathias Nater, ZÃ¼rich (mathias at mnn dot ch)
 *  Project and Source hosted on http://code.google.com/p/hyphenator/
 * 
 *  This JavaScript code is free software: you can redistribute
 *  it and/or modify it under the terms of the GNU Lesser
 *  General Public License (GNU LGPL) as published by the Free Software
 *  Foundation, either version 3 of the License, or (at your option)
 *  any later version.  The code is distributed WITHOUT ANY WARRANTY;
 *  without even the implied warranty of MERCHANTABILITY or FITNESS
 *  FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
 *
 *  As additional permission under GNU GPL version 3 section 7, you
 *  may distribute non-source (e.g., minimized or compacted) forms of
 *  that code without the copy of the GNU GPL normally required by
 *  section 4, provided you include this license notice and a URL
 *  through which recipients can access the Corresponding Source.
 */
 
/* 
 *  Comments are jsdoctoolkit formatted. See http://code.google.com/p/jsdoc-toolkit/
 */
 
/* The following comment is for JSLint: */
/*global window, ActiveXObject, unescape */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, regexp: true, sub: true, newcap: true, immed: true, evil: true, eqeqeq: false */


/**
 * @constructor
 * @description Provides all functionality to do hyphenation, except the patterns that are loaded
 * externally.
 * @author Mathias Nater, <a href = "mailto:mathias@mnn.ch">mathias@mnn.ch</a>
 * @version X.Y.Z
 * @namespace Holds all methods and properties
 * @example
 * &lt;script src = "Hyphenator.js" type = "text/javascript"&gt;&lt;/script&gt;
Â * &lt;script type = "text/javascript"&gt;
Â * Â  Hyphenator.run();
Â * &lt;/script&gt;
 */

var Hyphenator=(function(window){
var
supportedLang={
'be':'be.js',
'cs':'cs.js',
'da':'da.js',
'bn':'bn.js',
'de':'de.js',
'el':'el-monoton.js',
'el-monoton':'el-monoton.js',
'el-polyton':'el-polyton.js',
'en':'en-us.js',
'en-gb':'en-gb.js',
'en-us':'en-us.js',
'es':'es.js',
'fi':'fi.js',
'fr':'fr.js',
'grc':'grc.js',
'gu':'gu.js',
'hi':'hi.js',
'hu':'hu.js',
'hy':'hy.js',
'it':'it.js',
'kn':'kn.js',
'la':'la.js',
'lt':'lt.js',
'lv':'lv.js',
'ml':'ml.js',
'no':'no-nb.js',
'no-nb':'no-nb.js',
'nl':'nl.js',
'or':'or.js',
'pa':'pa.js',
'pl':'pl.js',
'pt':'pt.js',
'ru':'ru.js',
'sl':'sl.js',
'sv':'sv.js',
'ta':'ta.js',
'te':'te.js',
'tr':'tr.js',
'uk':'uk.js'
},
languageHint=(function(){
var k,r='';
for(k in supportedLang){
if(supportedLang.hasOwnProperty(k)){
r+=k+', ';
}
}
r=r.substring(0,r.length-2);
return r;
}()),
prompterStrings={
'be':'ÐœÐ¾Ð²Ð° Ð³ÑÑ‚Ð°Ð³Ð° ÑÐ°Ð¹Ñ‚Ð° Ð½Ðµ Ð¼Ð¾Ð¶Ð° Ð±Ñ‹Ñ ÑŒ Ð²Ñ‹Ð·Ð½Ð°Ñ‡Ð°Ð½Ñ‹ Ð°ÑžÑ‚Ð°Ð¼Ð°Ñ‚Ñ‹Ñ‡Ð½Ð°. ÐšÐ°Ð»Ñ– Ð»Ð°ÑÐºÐ° Ð¿Ð°ÐºÐ°Ð¶Ñ‹Ñ Ðµ Ð¼Ð¾Ð²Ñƒ:',
'cs':'Jazyk tÃ©to internetovÃ© strÃ¡nky nebyl automaticky rozpoznÃ¡n. UrÄete prosÃ­m jejÃ­ jazyk:',
'da':'Denne websides sprog kunne ikke bestemmes. Angiv venligst sprog:',
'de':'Die Sprache dieser Webseite konnte nicht automatisch bestimmt werden. Bitte Sprache angeben:',
'en':'The language of this website could not be determined automatically. Please indicate the main language:',
'es':'El idioma del sitio no pudo determinarse autom%E1ticamente. Por favor, indique el idioma principal:',
'fi':'Sivun kielt%E4 ei tunnistettu automaattisesti. M%E4%E4rit%E4 sivun p%E4%E4kieli:',
'fr':'La langue de ce site n%u2019a pas pu %EAtre d%E9termin%E9e automatiquement. Veuillez indiquer une langue, s.v.p.%A0:',
'hu':'A weboldal nyelvÃ©t nem sikerÃ¼lt automatikusan megÃ¡llapÃ­tani. KÃ©rem adja meg a nyelvet:',
'hy':'Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ°Õ¡ÕµÕ¿Õ¶Õ¡Õ¢Õ¥Ö€Õ¥Õ¬ Õ¡ÕµÕ½ Õ¯Õ¡ÕµÖ„Õ« Õ¬Õ¥Õ¦Õ¸Ö‚Õ¶Ö‰ Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¶Õ·Õ¥Ö„ Õ°Õ«Õ´Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¬Õ¥Õ¦Õ¸Ö‚Õ¶Õ',
'it':'Lingua del sito sconosciuta. Indicare una lingua, per favore:',
'kn':' ²œ ²¾ ²²  ²¤ ²¾ ²£ ²¦  ²­ ²¾ ²· ³  ²¯ ²¨ ³ ²¨ ³  ²¨ ²¿ ²° ³ ²§ ²° ²¿ ²¸ ²² ³  ²¸ ²¾ ²§ ³ ²¯ ²µ ²¾ ²— ³ ²¤ ³ ²¤ ²¿ ²² ³ ²².  ²¦ ²¯ ²µ ²¿ ²Ÿ ³ ²Ÿ ³  ²® ³ ²– ³ ²¯  ²­ ²¾ ²· ³  ²¯ ²¨ ³ ²¨ ³  ²¸ ³‚ ²š ²¿ ²¸ ²¿:',
'lt':'Nepavyko automatiÅ¡kai nustatyti Å¡ios svetainÄ—s kalbos. PraÅ¡ome Ä¯vesti kalbÄ…:',
'lv':'Å Ä«s lapas valodu nevarÄ“ja noteikt automÄtiski. LÅ«dzu norÄdiet pamata valodu:',
'ml':' ´ˆ  ´µ µ %u0D2C%u0D4D%u200C ´¸ µˆ ´± µ ´± ´¿ ´¨ µ ´± µ   ´­ ´¾ ´·  ´• ´£ µ ´Ÿ µ ´ª ´¿ ´Ÿ ´¿ ´¯ µ ´• µ ´• ´¾%u0D28%u0D4D%u200D  ´• ´´ ´¿ ´ž µ ´ž ´¿ ´² µ ´².  ´­ ´¾ ´·  ´ ´¤ ´¾ ´£ µ  ´¨ µ ´¨ µ  ´¤ ´¿ ´° ´ž µ ´ž µ  ´Ÿ µ ´• µ ´• µ ´•:',
'nl':'De taal van deze website kan niet automatisch worden bepaald. Geef de hoofdtaal op:',
'no':'Nettstedets sprÃ¥k kunne ikke finnes automatisk. Vennligst oppgi sprÃ¥k:',
'pt':'A lÃ­ngua deste site nÃ£o pÃ´de ser determinada automaticamente. Por favor indique a lÃ­ngua principal:',
'ru':'Ð¯Ð·Ñ‹Ðº ÑÑ‚Ð¾Ð³Ð¾ ÑÐ°Ð¹Ñ‚Ð° Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ‚ Ð±Ñ‹Ñ‚ÑŒ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑÐºÐ¸. ÐŸÐ¾Ð¶Ð°Ð»ÑƒÐ¹ÑÑ‚Ð° ÑƒÐºÐ°Ð¶Ð¸Ñ‚Ðµ ÑÐ·Ñ‹Ðº:',
'sl':'Jezika te spletne strani ni bilo mogoÄe samodejno doloÄiti. Prosim navedite jezik:',
'sv':'Spr%E5ket p%E5 den h%E4r webbplatsen kunde inte avg%F6ras automatiskt. V%E4nligen ange:',
'tr':'Bu web sitesinin dili otomatik olarak tespit edilememiÅŸtir. LÃ¼tfen dÃ¶kÃ¼manÄ±n dilini seÃ§iniz%A0:',
'uk':'ÐœÐ¾Ð²Ð° Ñ ÑŒÐ¾Ð³Ð¾ Ð²ÐµÐ±-ÑÐ°Ð¹Ñ‚Ñƒ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð±ÑƒÑ‚Ð¸ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð° Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾. Ð‘ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð²ÐºÐ°Ð¶Ñ–Ñ‚ÑŒ Ð³Ð¾Ð»Ð¾Ð²Ð½Ñƒ Ð¼Ð¾Ð²Ñƒ:'
},
basePath=(function(){
var s=document.getElementsByTagName('script'),i=0,p,src,t;
while(!!(t=s[i++])){
if(!t.src){
continue;
}
src=t.src;
p=src.indexOf('Hyphenator.js');
if(p!==-1){
return src.substring(0,p);
}
}
return'http://hyphenator.googlecode.com/svn/trunk/';
}()),
isLocal=(function(){
var re=false;
if(window.location.href.indexOf(basePath)!==-1){
re=true;
}
return re;
}()),
documentLoaded=false,
documentCount=0,
persistentConfig=false,
contextWindow=window,
doFrames=false,
dontHyphenate={'script':true,'code':true,'pre':true,'img':true,'br':true,'samp':true,'kbd':true,'var':true,'abbr':true,'acronym':true,'sub':true,'sup':true,'button':true,'option':true,'label':true,'textarea':true,'input':true},
enableCache=true,
storageType='local',
storage,
enableReducedPatternSet=false,
enableRemoteLoading=true,
displayToggleBox=false,
hyphenateClass='hyphenate',
dontHyphenateClass='donthyphenate',
min=6,
orphanControl=1,
isBookmarklet=(function(){
var loc=null,re=false,jsArray=document.getElementsByTagName('script'),i,l;
for(i=0,l=jsArray.length;i<l;i++){
if(!!jsArray[i].getAttribute('src')){
loc=jsArray[i].getAttribute('src');
}
if(!loc){
continue;
}else if(loc.indexOf('Hyphenator.js?bm=true')!==-1){
re=true;
}
}
return re;
}()),
mainLanguage=null,
defaultLanguage='',
elements=[],
exceptions={},
countObjProps=function(obj){
var k,l=0;
for(k in obj){
if(obj.hasOwnProperty(k)){
l++;
}
}
return l;
},
docLanguages={},
state=0,
url='(\\w*:\/\/)?((\\w*:)?(\\w*)@)?((([\\d]{1,3}\\.){3}([\\d]{1,3}))|((www\\.|[a-zA-Z]\\.)?[a-zA-Z0-9\\-\\.]+\\.([a-z]{2,4})))(:\\d*)?(\/[\\w#!:\\.?\\+=&%@!\\-]*)*',
mail='[\\w-\\.]+@[\\w\\.]+',
urlOrMailRE=new RegExp('('+url+')|('+mail+')','i'),
zeroWidthSpace=(function(){
var zws,ua=navigator.userAgent.toLowerCase();
zws=String.fromCharCode(8203);
if(ua.indexOf('msie 6')!==-1){
zws='';
}
if(ua.indexOf('opera')!==-1&&ua.indexOf('version/10.00')!==-1){
zws='';
}
return zws;
}()),
createElem=function(tagname,context){
context=context||contextWindow;
if(document.createElementNS){
return context.document.createElementNS('http://www.w3.org/1999/xhtml',tagname);
}else if(document.createElement){
return context.document.createElement(tagname);
}
},
onHyphenationDone=function(){},
onError=function(e){
window.alert("Hyphenator.js says:\n\nAn Error ocurred:\n"+e.message);
},
selectorFunction=function(){
var tmp,el=[],i,l;
if(document.getElementsByClassName){
el=contextWindow.document.getElementsByClassName(hyphenateClass);
}else{
tmp=contextWindow.document.getElementsByTagName('*');
l=tmp.length;
for(i=0;i<l;i++)
{
if(tmp[i].className.indexOf(hyphenateClass)!==-1&&tmp[i].className.indexOf(dontHyphenateClass)===-1){
el.push(tmp[i]);
}
}
}
return el;
},
intermediateState='hidden',
hyphen=String.fromCharCode(173),
urlhyphen=zeroWidthSpace,
safeCopy=true,
Expando=(function(){
var container={},
name="HyphenatorExpando_"+Math.random(),
uuid=0;
return{
getDataForElem:function(elem){
return container[elem[name].id];
},
setDataForElem:function(elem,data){
var id;
if(elem[name]&&elem[name].id!==''){
id=elem[name].id;
}else{
id=uuid++;
elem[name]={'id':id};
}
container[id]=data;
},
appendDataForElem:function(elem,data){
var k;
for(k in data){
if(data.hasOwnProperty(k)){
container[elem[name].id][k]=data[k];
}
}
},
delDataOfElem:function(elem){
delete container[elem[name]];
}
};
}()),
runOnContentLoaded=function(w,f){
var DOMContentLoaded=function(){},toplevel,hyphRunForThis={};
if(documentLoaded&&!hyphRunForThis[w.location.href]){
f();
hyphRunForThis[w.location.href]=true;
return;
}
function init(context){
contextWindow=context||window;
if(!hyphRunForThis[contextWindow.location.href]&&(!documentLoaded||contextWindow!=window.parent)){
documentLoaded=true;
f();
hyphRunForThis[contextWindow.location.href]=true;
}
}
function doScrollCheck(){
try{
document.documentElement.doScroll("left");
}catch(error){
setTimeout(doScrollCheck,1);
return;
}
init(window);
}
function doOnLoad(){
var i,haveAccess,fl=window.frames.length;
if(doFrames&&fl>0){
for(i=0;i<fl;i++){
haveAccess=undefined;
try{
haveAccess=window.frames[i].document.toString();
}catch(e){
haveAccess=undefined;
}
if(!!haveAccess){
init(window.frames[i]);
}
}
contextWindow=window;
f();
hyphRunForThis[window.location.href]=true;
}else{
init(window);
}
}
if(document.addEventListener){
DOMContentLoaded=function(){
document.removeEventListener("DOMContentLoaded",DOMContentLoaded,false);
if(doFrames&&window.frames.length>0){
return;
}else{
init(window);
}
};
}else if(document.attachEvent){
DOMContentLoaded=function(){
if(document.readyState==="complete"){
document.detachEvent("onreadystatechange",DOMContentLoaded);
if(doFrames&&window.frames.length>0){
return;
}else{
init(window);
}
}
};
}
if(document.addEventListener){
document.addEventListener("DOMContentLoaded",DOMContentLoaded,false);
window.addEventListener("load",doOnLoad,false);
}else if(document.attachEvent){
document.attachEvent("onreadystatechange",DOMContentLoaded);
window.attachEvent("onload",doOnLoad);
toplevel=false;
try{
toplevel=window.frameElement===null;
}catch(e){}
if(document.documentElement.doScroll&&toplevel){
doScrollCheck();
}
}
},
getLang=function(el,fallback){
if(!!el.getAttribute('lang')){
return el.getAttribute('lang').toLowerCase();
}
try{
if(!!el.getAttribute('xml:lang')){
return el.getAttribute('xml:lang').toLowerCase();
}
}catch(ex){}
if(el.tagName!=='HTML'){
return getLang(el.parentNode,true);
}
if(fallback){
return mainLanguage;
}
return null;
},
autoSetMainLanguage=function(w){
w=w||contextWindow;
var el=w.document.getElementsByTagName('html')[0],
m=w.document.getElementsByTagName('meta'),
i,text,e,ul;
mainLanguage=getLang(el,false);
if(!mainLanguage){
for(i=0;i<m.length;i++){
if(!!m[i].getAttribute('http-equiv')&&(m[i].getAttribute('http-equiv').toLowerCase()==='content-language')){
mainLanguage=m[i].getAttribute('content').toLowerCase();
}
if(!!m[i].getAttribute('name')&&(m[i].getAttribute('name').toLowerCase()==='dc.language')){
mainLanguage=m[i].getAttribute('content').toLowerCase();
}
if(!!m[i].getAttribute('name')&&(m[i].getAttribute('name').toLowerCase()==='language')){
mainLanguage=m[i].getAttribute('content').toLowerCase();
}
}
}
if(!mainLanguage&&doFrames&&contextWindow!=window.parent){
autoSetMainLanguage(window.parent);
}
if(!mainLanguage&&defaultLanguage!==''){
mainLanguage=defaultLanguage;
}
if(!mainLanguage){
text='';
ul=navigator.language?navigator.language:navigator.userLanguage;
ul=ul.substring(0,2);
if(prompterStrings.hasOwnProperty(ul)){
text=prompterStrings[ul];
}else{
text=prompterStrings.en;
}
text+=' (ISO 639-1)\n\n'+languageHint;
mainLanguage=window.prompt(unescape(text),ul).toLowerCase();
}
if(!supportedLang.hasOwnProperty(mainLanguage)){
if(supportedLang.hasOwnProperty(mainLanguage.split('-')[0])){
mainLanguage=mainLanguage.split('-')[0];
}else{
e=new Error('The language "'+mainLanguage+'" is not yet supported.');
throw e;
}
}
},
gatherDocumentInfos=function(){
var elToProcess,tmp,i=0,
process=function(el,hide,lang){
var n,i=0,hyphenatorSettings={};
if(hide&&intermediateState==='hidden'){
if(!!el.getAttribute('style')){
hyphenatorSettings.hasOwnStyle=true;
}else{
hyphenatorSettings.hasOwnStyle=false;
}
hyphenatorSettings.isHidden=true;
el.style.visibility='hidden';
}
if(el.lang&&typeof(el.lang)==='string'){
hyphenatorSettings.language=el.lang.toLowerCase();
}else if(lang){
hyphenatorSettings.language=lang.toLowerCase();
}else{
hyphenatorSettings.language=getLang(el,true);
}
lang=hyphenatorSettings.language;
if(supportedLang[lang]){
docLanguages[lang]=true;
}else{
if(supportedLang.hasOwnProperty(lang.split('-')[0])){
lang=lang.split('-')[0];
hyphenatorSettings.language=lang;
}else if(!isBookmarklet){
onError(new Error('Language '+lang+' is not yet supported.'));
}
}
Expando.setDataForElem(el,hyphenatorSettings);
elements.push(el);
while(!!(n=el.childNodes[i++])){
if(n.nodeType===1&&!dontHyphenate[n.nodeName.toLowerCase()]&&
n.className.indexOf(dontHyphenateClass)===-1&&!(n in elToProcess)){
process(n,false,lang);
}
}
};
if(isBookmarklet){
elToProcess=contextWindow.document.getElementsByTagName('body')[0];
process(elToProcess,false,mainLanguage);
}else{
elToProcess=selectorFunction();
while(!!(tmp=elToProcess[i++]))
{
process(tmp,true,'');
}
}
if(!Hyphenator.languages.hasOwnProperty(mainLanguage)){
docLanguages[mainLanguage]=true;
}else if(!Hyphenator.languages[mainLanguage].prepared){
docLanguages[mainLanguage]=true;
}
if(elements.length>0){
Expando.appendDataForElem(elements[elements.length-1],{isLast:true});
}
},
convertPatterns=function(lang){
var plen,anfang,ende,pats,pat,key,tmp={};
pats=Hyphenator.languages[lang].patterns;
for(plen in pats){
if(pats.hasOwnProperty(plen)){
plen=parseInt(plen,10);
anfang=0;
ende=plen;
while(!!(pat=pats[plen].substring(anfang,ende))){
key=pat.replace(/\d/g,'');
tmp[key]=pat;
anfang=ende;
ende+=plen;
}
}
}
Hyphenator.languages[lang].patterns=tmp;
Hyphenator.languages[lang].patternsConverted=true;
},
convertExceptionsToObject=function(exc){
var w=exc.split(', '),
r={},
i,l,key;
for(i=0,l=w.length;i<l;i++){
key=w[i].replace(/-/g,'');
if(!r.hasOwnProperty(key)){
r[key]=w[i];
}
}
return r;
},
loadPatterns=function(lang){
var url,xhr,head,script;
if(supportedLang[lang]&&!Hyphenator.languages[lang]){
url=basePath+'patterns/'+supportedLang[lang];
}else{
return;
}
if(isLocal&&!isBookmarklet){
xhr=null;
if(typeof XMLHttpRequest!=='undefined'){
xhr=new XMLHttpRequest();
}
if(!xhr){
try{
xhr=new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
xhr=null;
}
}
if(xhr){
xhr.open('HEAD',url,false);
xhr.setRequestHeader('Cache-Control','no-cache');
xhr.send(null);
if(xhr.status===404){
onError(new Error('Could not load\n'+url));
delete docLanguages[lang];
return;
}
}
}
if(createElem){
head=window.document.getElementsByTagName('head').item(0);
script=createElem('script',window);
script.src=url;
script.type='text/javascript';
head.appendChild(script);
}
},
prepareLanguagesObj=function(lang){
var lo=Hyphenator.languages[lang],wrd;
if(!lo.prepared){
if(enableCache){
lo.cache={};
lo['cache']=lo.cache;
}
if(enableReducedPatternSet){
lo.redPatSet={};
}
if(lo.hasOwnProperty('exceptions')){
Hyphenator.addExceptions(lang,lo.exceptions);
delete lo.exceptions;
}
if(exceptions.hasOwnProperty('global')){
if(exceptions.hasOwnProperty(lang)){
exceptions[lang]+=', '+exceptions.global;
}else{
exceptions[lang]=exceptions.global;
}
}
if(exceptions.hasOwnProperty(lang)){
lo.exceptions=convertExceptionsToObject(exceptions[lang]);
delete exceptions[lang];
}else{
lo.exceptions={};
}
convertPatterns(lang);
wrd='[\\w'+lo.specialChars+'@'+String.fromCharCode(173)+'-]{'+min+',}';
lo.genRegExp=new RegExp('('+url+')|('+mail+')|('+wrd+')','gi');
lo.prepared=true;
}
if(!!storage){
try{
storage.setItem('Hyphenator_'+lang,window.JSON.stringify(lo));
}catch(e){
}
}
},
prepare=function(callback){
var lang,interval,tmp1,tmp2;
if(!enableRemoteLoading){
for(lang in Hyphenator.languages){
if(Hyphenator.languages.hasOwnProperty(lang)){
prepareLanguagesObj(lang);
}
}
state=2;
callback();
return;
}
state=1;
for(lang in docLanguages){
if(docLanguages.hasOwnProperty(lang)){
if(!!storage&&storage.getItem('Hyphenator_'+lang)){
Hyphenator.languages[lang]=window.JSON.parse(storage.getItem('Hyphenator_'+lang));
if(exceptions.hasOwnProperty('global')){
tmp1=convertExceptionsToObject(exceptions.global);
for(tmp2 in tmp1){
if(tmp1.hasOwnProperty(tmp2)){
Hyphenator.languages[lang].exceptions[tmp2]=tmp1[tmp2];
}
}
}
if(exceptions.hasOwnProperty(lang)){
tmp1=convertExceptionsToObject(exceptions[lang]);
for(tmp2 in tmp1){
if(tmp1.hasOwnProperty(tmp2)){
Hyphenator.languages[lang].exceptions[tmp2]=tmp1[tmp2];
}
}
delete exceptions[lang];
}
tmp1='[\\w'+Hyphenator.languages[lang].specialChars+'@'+String.fromCharCode(173)+'-]{'+min+',}';
Hyphenator.languages[lang].genRegExp=new RegExp('('+url+')|('+mail+')|('+tmp1+')','gi');
delete docLanguages[lang];
continue;
}else{
loadPatterns(lang);
}
}
}
if(countObjProps(docLanguages)===0){
state=2;
callback();
return;
}
interval=window.setInterval(function(){
var finishedLoading=true,lang;
for(lang in docLanguages){
if(docLanguages.hasOwnProperty(lang)){
finishedLoading=false;
if(!!Hyphenator.languages[lang]){
delete docLanguages[lang];
prepareLanguagesObj(lang);
}
}
}
if(finishedLoading){
window.clearInterval(interval);
state=2;
callback();
}
},100);
},
toggleBox=function(){
var myBox,bdy,myIdAttribute,myTextNode,myClassAttribute,
text=(Hyphenator.doHyphenation?'Hy-phen-a-tion':'Hyphenation');
if(!!(myBox=contextWindow.document.getElementById('HyphenatorToggleBox'))){
myBox.firstChild.data=text;
}else{
bdy=contextWindow.document.getElementsByTagName('body')[0];
myBox=createElem('div',contextWindow);
myIdAttribute=contextWindow.document.createAttribute('id');
myIdAttribute.nodeValue='HyphenatorToggleBox';
myClassAttribute=contextWindow.document.createAttribute('class');
myClassAttribute.nodeValue=dontHyphenateClass;
myTextNode=contextWindow.document.createTextNode(text);
myBox.appendChild(myTextNode);
myBox.setAttributeNode(myIdAttribute);
myBox.setAttributeNode(myClassAttribute);
myBox.onclick=Hyphenator.toggleHyphenation;
myBox.style.position='absolute';
myBox.style.top='0px';
myBox.style.right='0px';
myBox.style.margin='0';
myBox.style.backgroundColor='#AAAAAA';
myBox.style.color='#FFFFFF';
myBox.style.font='6pt Arial';
myBox.style.letterSpacing='0.2em';
myBox.style.padding='3px';
myBox.style.cursor='pointer';
myBox.style.WebkitBorderBottomLeftRadius='4px';
myBox.style.MozBorderRadiusBottomleft='4px';
bdy.appendChild(myBox);
}
},
hyphenateWord=function(lang,word){
var lo=Hyphenator.languages[lang],
parts,i,l,w,wl,s,hypos,p,maxwins,win,pat=false,patk,c,t,n,numb3rs,inserted,hyphenatedword,val;
if(word===''){
return'';
}
if(word.indexOf(hyphen)!==-1){
return word;
}
if(enableCache&&lo.cache.hasOwnProperty(word)){
return lo.cache[word];
}
if(lo.exceptions.hasOwnProperty(word)){
return lo.exceptions[word].replace(/-/g,hyphen);
}
if(word.indexOf('-')!==-1){
parts=word.split('-');
for(i=0,l=parts.length;i<l;i++){
parts[i]=hyphenateWord(lang,parts[i]);
}
return parts.join('-');
}
w='_'+word+'_';
wl=w.length;
s=w.split('');
if(word.indexOf("'")!==-1){
w=w.toLowerCase().replace("'","â€™");
}else{
w=w.toLowerCase();
}
hypos=[];
numb3rs={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9};
n=wl-lo.shortestPattern;
for(p=0;p<=n;p++){
maxwins=Math.min((wl-p),lo.longestPattern);
for(win=lo.shortestPattern;win<=maxwins;win++){
if(lo.patterns.hasOwnProperty(patk=w.substring(p,p+win))){
pat=lo.patterns[patk];
if(enableReducedPatternSet&&(typeof pat==='string')){
lo.redPatSet[patk]=pat;
}
if(typeof pat==='string'){
t=0;
val=[];
for(i=0;i<pat.length;i++){
if(!!(c=numb3rs[pat.charAt(i)])){
val.push(i-t,c);
t++;
}
}
pat=lo.patterns[patk]=val;
}
}else{
continue;
}
for(i=0;i<pat.length;i++){
c=p-1+pat[i];
if(!hypos[c]||hypos[c]<pat[i+1]){
hypos[c]=pat[i+1];
}
i++;
}
}
}
inserted=0;
for(i=lo.leftmin;i<=(word.length-lo.rightmin);i++){
if(!!(hypos[i]&1)){
s.splice(i+inserted+1,0,hyphen);
inserted++;
}
}
hyphenatedword=s.slice(1,-1).join('');
if(enableCache){
lo.cache[word]=hyphenatedword;
}
return hyphenatedword;
},
hyphenateURL=function(url){
return url.replace(/([:\/\.\?#&_,;!@]+)/gi,'$&'+urlhyphen);
},
removeHyphenationFromElement=function(el){
var h,i=0,n;
switch(hyphen){
case'|':
h='\\|';
break;
case'+':
h='\\+';
break;
case'*':
h='\\*';
break;
default:
h=hyphen;
}
while(!!(n=el.childNodes[i++])){
if(n.nodeType===3){
n.data=n.data.replace(new RegExp(h,'g'),'');
n.data=n.data.replace(new RegExp(zeroWidthSpace,'g'),'');
}else if(n.nodeType===1){
removeHyphenationFromElement(n);
}
}
},
registerOnCopy=function(el){
var body=el.ownerDocument.getElementsByTagName('body')[0],
shadow,
selection,
range,
rangeShadow,
restore,
oncopyHandler=function(e){
e=e||window.event;
var target=e.target||e.srcElement,
currDoc=target.ownerDocument,
body=currDoc.getElementsByTagName('body')[0],
targetWindow='defaultView'in currDoc?currDoc.defaultView:currDoc.parentWindow;
if(target.tagName&&dontHyphenate[target.tagName.toLowerCase()]){
return;
}
shadow=currDoc.createElement('div');
shadow.style.overflow='hidden';
shadow.style.position='absolute';
shadow.style.top='-5000px';
shadow.style.height='1px';
body.appendChild(shadow);
if(!!window.getSelection){
selection=targetWindow.getSelection();
range=selection.getRangeAt(0);
shadow.appendChild(range.cloneContents());
removeHyphenationFromElement(shadow);
selection.selectAllChildren(shadow);
restore=function(){
shadow.parentNode.removeChild(shadow);
selection.addRange(range);
};
}else{
selection=targetWindow.document.selection;
range=selection.createRange();
shadow.innerHTML=range.htmlText;
removeHyphenationFromElement(shadow);
rangeShadow=body.createTextRange();
rangeShadow.moveToElementText(shadow);
rangeShadow.select();
restore=function(){
shadow.parentNode.removeChild(shadow);
if(range.text!==""){
range.select();
}
};
}
window.setTimeout(restore,0);
};
if(!body){
return;
}
el=el||body;
if(window.addEventListener){
el.addEventListener("copy",oncopyHandler,false);
}else{
el.attachEvent("oncopy",oncopyHandler);
}
},
hyphenateElement=function(el){
var hyphenatorSettings=Expando.getDataForElem(el),
lang=hyphenatorSettings.language,hyphenate,n,i,
controlOrphans=function(part){
var h,r;
switch(hyphen){
case'|':
h='\\|';
break;
case'+':
h='\\+';
break;
case'*':
h='\\*';
break;
default:
h=hyphen;
}
if(orphanControl>=2){
r=part.split(' ');
r[1]=r[1].replace(new RegExp(h,'g'),'');
r[1]=r[1].replace(new RegExp(zeroWidthSpace,'g'),'');
r=r.join(' ');
}
if(orphanControl===3){
r=r.replace(/[ ]+/g,String.fromCharCode(160));
}
return r;
};
if(Hyphenator.languages.hasOwnProperty(lang)){
hyphenate=function(word){
if(!Hyphenator.doHyphenation){
return word;
}else if(urlOrMailRE.test(word)){
return hyphenateURL(word);
}else{
return hyphenateWord(lang,word);
}
};
if(safeCopy&&(el.tagName.toLowerCase()!=='body')){
registerOnCopy(el);
}
i=0;
while(!!(n=el.childNodes[i++])){
if(n.nodeType===3&&n.data.length>=min){
n.data=n.data.replace(Hyphenator.languages[lang].genRegExp,hyphenate);
if(orphanControl!==1){
n.data=n.data.replace(/[\S]+ [\S]+$/,controlOrphans);
}
}
}
}
if(hyphenatorSettings.isHidden&&intermediateState==='hidden'){
el.style.visibility='visible';
if(!hyphenatorSettings.hasOwnStyle){
el.setAttribute('style','');
el.removeAttribute('style');
}else{
if(el.style.removeProperty){
el.style.removeProperty('visibility');
}else if(el.style.removeAttribute){
el.style.removeAttribute('visibility');
}
}
}
if(hyphenatorSettings.isLast){
state=3;
documentCount--;
if(documentCount>(-1000)&&documentCount<=0){
documentCount=(-2000);
onHyphenationDone();
}
}
},
hyphenateDocument=function(){
function bind(fun,arg){
return function(){
return fun(arg);
};
}
var i=0,el;
while(!!(el=elements[i++])){
if(el.ownerDocument.location.href===contextWindow.location.href){
window.setTimeout(bind(hyphenateElement,el),0);
}
}
},
removeHyphenationFromDocument=function(){
var i=0,el;
while(!!(el=elements[i++])){
removeHyphenationFromElement(el);
}
state=4;
},
createStorage=function(){
try{
if(storageType!=='none'&&
typeof(window.localStorage)!=='undefined'&&
typeof(window.sessionStorage)!=='undefined'&&
typeof(window.JSON.stringify)!=='undefined'&&
typeof(window.JSON.parse)!=='undefined'){
switch(storageType){
case'session':
storage=window.sessionStorage;
break;
case'local':
storage=window.localStorage;
break;
default:
storage=undefined;
break;
}
}
}catch(f){
}
},
storeConfiguration=function(){
if(!storage){
return;
}
var settings={
'STORED':true,
'classname':hyphenateClass,
'donthyphenateclassname':dontHyphenateClass,
'minwordlength':min,
'hyphenchar':hyphen,
'urlhyphenchar':urlhyphen,
'togglebox':toggleBox,
'displaytogglebox':displayToggleBox,
'remoteloading':enableRemoteLoading,
'enablecache':enableCache,
'onhyphenationdonecallback':onHyphenationDone,
'onerrorhandler':onError,
'intermediatestate':intermediateState,
'selectorfunction':selectorFunction,
'safecopy':safeCopy,
'doframes':doFrames,
'storagetype':storageType,
'orphancontrol':orphanControl,
'dohyphenation':Hyphenator.doHyphenation,
'persistentconfig':persistentConfig,
'defaultlanguage':defaultLanguage
};
storage.setItem('Hyphenator_config',window.JSON.stringify(settings));
},
restoreConfiguration=function(){
var settings;
if(storage.getItem('Hyphenator_config')){
settings=window.JSON.parse(storage.getItem('Hyphenator_config'));
Hyphenator.config(settings);
}
};
return{
version:'X.Y.Z',
doHyphenation:true,
languages:{},
config:function(obj){
var assert=function(name,type){
if(typeof obj[name]===type){
return true;
}else{
onError(new Error('Config onError: '+name+' must be of type '+type));
return false;
}
},
key;
if(obj.hasOwnProperty('storagetype')){
if(assert('storagetype','string')){
storageType=obj.storagetype;
}
if(!storage){
createStorage();
}
}
if(!obj.hasOwnProperty('STORED')&&storage&&obj.hasOwnProperty('persistentconfig')&&obj.persistentconfig===true){
restoreConfiguration();
}
for(key in obj){
if(obj.hasOwnProperty(key)){
switch(key){
case'STORED':
break;
case'classname':
if(assert('classname','string')){
hyphenateClass=obj[key];
}
break;
case'donthyphenateclassname':
if(assert('donthyphenateclassname','string')){
dontHyphenateClass=obj[key];
}
break;
case'minwordlength':
if(assert('minwordlength','number')){
min=obj[key];
}
break;
case'hyphenchar':
if(assert('hyphenchar','string')){
if(obj.hyphenchar==='&shy;'){
obj.hyphenchar=String.fromCharCode(173);
}
hyphen=obj[key];
}
break;
case'urlhyphenchar':
if(obj.hasOwnProperty('urlhyphenchar')){
if(assert('urlhyphenchar','string')){
urlhyphen=obj[key];
}
}
break;
case'togglebox':
if(assert('togglebox','function')){
toggleBox=obj[key];
}
break;
case'displaytogglebox':
if(assert('displaytogglebox','boolean')){
displayToggleBox=obj[key];
}
break;
case'remoteloading':
if(assert('remoteloading','boolean')){
enableRemoteLoading=obj[key];
}
break;
case'enablecache':
if(assert('enablecache','boolean')){
enableCache=obj[key];
}
break;
case'enablereducedpatternset':
if(assert('enablereducedpatternset','boolean')){
enableReducedPatternSet=obj[key];
}
break;
case'onhyphenationdonecallback':
if(assert('onhyphenationdonecallback','function')){
onHyphenationDone=obj[key];
}
break;
case'onerrorhandler':
if(assert('onerrorhandler','function')){
onError=obj[key];
}
break;
case'intermediatestate':
if(assert('intermediatestate','string')){
intermediateState=obj[key];
}
break;
case'selectorfunction':
if(assert('selectorfunction','function')){
selectorFunction=obj[key];
}
break;
case'safecopy':
if(assert('safecopy','boolean')){
safeCopy=obj[key];
}
break;
case'doframes':
if(assert('doframes','boolean')){
doFrames=obj[key];
}
break;
case'storagetype':
if(assert('storagetype','string')){
storageType=obj[key];
}
break;
case'orphancontrol':
if(assert('orphancontrol','number')){
orphanControl=obj[key];
}
break;
case'dohyphenation':
if(assert('dohyphenation','boolean')){
Hyphenator.doHyphenation=obj[key];
}
break;
case'persistentconfig':
if(assert('persistentconfig','boolean')){
persistentConfig=obj[key];
}
break;
case'defaultlanguage':
if(assert('defaultlanguage','string')){
defaultLanguage=obj[key];
}
break;
default:
onError(new Error('Hyphenator.config: property '+key+' not known.'));
}
}
}
if(storage&&persistentConfig){
storeConfiguration();
}
},
run:function(){
documentCount=0;
var process=function(){
try{
if(contextWindow.document.getElementsByTagName('frameset').length>0){
return;
}
documentCount++;
autoSetMainLanguage(undefined);
gatherDocumentInfos();
prepare(hyphenateDocument);
if(displayToggleBox){
toggleBox();
}
}catch(e){
onError(e);
}
},i,haveAccess,fl=window.frames.length;
if(!storage){
createStorage();
}
if(!documentLoaded&&!isBookmarklet){
runOnContentLoaded(window,process);
}
if(isBookmarklet||documentLoaded){
if(doFrames&&fl>0){
for(i=0;i<fl;i++){
haveAccess=undefined;
try{
haveAccess=window.frames[i].document.toString();
}catch(e){
haveAccess=undefined;
}
if(!!haveAccess){
contextWindow=window.frames[i];
process();
}
}
}
contextWindow=window;
process();
}
},
addExceptions:function(lang,words){
if(lang===''){
lang='global';
}
if(exceptions.hasOwnProperty(lang)){
exceptions[lang]+=", "+words;
}else{
exceptions[lang]=words;
}
},
hyphenate:function(target,lang){
var hyphenate,n,i;
if(Hyphenator.languages.hasOwnProperty(lang)){
if(!Hyphenator.languages[lang].prepared){
prepareLanguagesObj(lang);
}
hyphenate=function(word){
if(urlOrMailRE.test(word)){
return hyphenateURL(word);
}else{
return hyphenateWord(lang,word);
}
};
if(typeof target==='string'||target.constructor===String){
return target.replace(Hyphenator.languages[lang].genRegExp,hyphenate);
}else if(typeof target==='object'){
i=0;
while(!!(n=target.childNodes[i++])){
if(n.nodeType===3&&n.data.length>=min){
n.data=n.data.replace(Hyphenator.languages[lang].genRegExp,hyphenate);
}else if(n.nodeType===1){
if(n.lang!==''){
Hyphenator.hyphenate(n,n.lang);
}else{
Hyphenator.hyphenate(n,lang);
}
}
}
}
}else{
onError(new Error('Language "'+lang+'" is not loaded.'));
}
},
getRedPatternSet:function(lang){
return Hyphenator.languages[lang].redPatSet;
},
isBookmarklet:function(){
return isBookmarklet;
},
getConfigFromURI:function(){
var loc=null,re={},jsArray=document.getElementsByTagName('script'),i,j,l,s,gp,option;
for(i=0,l=jsArray.length;i<l;i++){
if(!!jsArray[i].getAttribute('src')){
loc=jsArray[i].getAttribute('src');
}
if(!loc){
continue;
}else{
s=loc.indexOf('Hyphenator.js?');
if(s===-1){
continue;
}
gp=loc.substring(s+14).split('&');
for(j=0;j<gp.length;j++){
option=gp[j].split('=');
if(option[0]==='bm'){
continue;
}
if(option[1]==='true'){
re[option[0]]=true;
continue;
}
if(option[1]==='false'){
re[option[0]]=false;
continue;
}
if(isFinite(option[1])){
re[option[0]]=parseInt(option[1],10);
continue;
}
if(option[0]==='onhyphenationdonecallback'){
re[option[0]]=new Function('',option[1]);
continue;
}
re[option[0]]=option[1];
}
break;
}
}
return re;
},
toggleHyphenation:function(){
if(Hyphenator.doHyphenation){
removeHyphenationFromDocument();
Hyphenator.doHyphenation=false;
storeConfiguration();
toggleBox();
}else{
hyphenateDocument();
Hyphenator.doHyphenation=true;
storeConfiguration();
toggleBox();
}
}
};
}(window));
Hyphenator['languages']=Hyphenator.languages;
Hyphenator['config']=Hyphenator.config;
Hyphenator['run']=Hyphenator.run;
Hyphenator['addExceptions']=Hyphenator.addExceptions;
Hyphenator['hyphenate']=Hyphenator.hyphenate;
Hyphenator['getRedPatternSet']=Hyphenator.getRedPatternSet;
Hyphenator['isBookmarklet']=Hyphenator.isBookmarklet;
Hyphenator['getConfigFromURI']=Hyphenator.getConfigFromURI;
Hyphenator['toggleHyphenation']=Hyphenator.toggleHyphenation;
window['Hyphenator']=Hyphenator;
if(Hyphenator.isBookmarklet()){
Hyphenator.config({displaytogglebox:true,intermediatestate:'visible',doframes:true});
Hyphenator.config(Hyphenator.getConfigFromURI());
Hyphenator.run();
}
