/* Facelift Image Replacement v2.0 beta 2 Facelift was written and is maintained by Cory Mawhorter. It is available from http://facelift.mawhorter.net/ === This file is part of Facelife Image Replacement ("FLIR"). FLIR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. FLIR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Facelift Image Replacement. If not, see . */ var FLIR = { version: '2.0b2' ,options: { path: '' ,defaultStyle: null ,ignoredEls: 'BR,HR,IMG,INPUT,SELECT' // if you are replacing the background image, the element must be display:block otherwise it won't work // setting this option to true will check to see if an element is block, and if not, make it so // this is off by default because it slows down replacement ,bkgCheckForBlock: false ,onreplacing: null ,onreplaced: null ,onreplacingchild: null ,onreplacedchild: null } ,findEmbededFonts: false ,dpi: 96 ,flirElements: {} ,flirPlugins: [] ,isIE6: true ,isIE: true ,hoverEnabled: false // when designing a site with facelift, IE will sometimes cache your mistakes which will cause weird // stretched images. turn this on to keep that from happening and back off when // you get everything how you want it ,debug: false ,init: function(options) { if(typeof options != 'undefined') for(var i in options) this.options[i] = options[i]; if(this.options.defaultStyle == null) this.options.defaultStyle = new FLIRStyle(); this.detectBrowser(); this.calcDPI(); if((this.findEmbededFonts = (typeof FLIR.discoverEmbededFonts == 'function'))) this.discoverEmbededFonts(); this.hoverEnabled = (typeof this.addHover == 'function'); FLIR.pcall('init', arguments); } ,install: function(plugin) { this.flirPlugins.push(plugin); } ,pcall: function(func, call) { var ret = call; for(var i=0; i 1) { for(var i =0; i < n.childNodes.length; i++) { var node = n.childNodes[i]; if(node && node.nodeType == 3) { if(bTrim) { trimreg = i==0 ? /^\s+/g : /\s+$/g; node.innerHTML = node.innerHTML.replace(trimreg, ''); } var span = document.createElement('SPAN'); span.style.margin = span.style.padding = span.style.border = '0'; span.className = 'flir-span'; span.flirSpan = true; if(node.nodeValue.match(/^[\n\r]+$/)) continue; // skip new lines var txt = node.nodeValue.replace(/[\t\n\r]/g, ' ').replace(/\s\s+/g, ' '); span.innerHTML = !FLIR.isIE ? txt : node.nodeValue.replace(/^\s+|\s+$/g,' '); n.replaceChild(span, node); } } } } ,replace: function(o, FStyle) { // o can be a selector, element, or array of elements if(!(args = FLIR.pcall('replace', arguments))) return; o = args[0]; FStyle = args[1]; if(!o || o.flirReplaced) return; // bad element or already replaced if(!this.isFStyle(FStyle) && typeof FStyle == 'object') // object lit passed, setup FLIRStyle FStyle = new FLIRStyle(FStyle); else if(!this.isFStyle(FStyle)) // something else/nothing passed, use default FStyle = this.options.defaultStyle; // no FStyle specified, use default if(typeof o == 'string') o = this.getElements(o); if(typeof o.length != 'undefined') { if(o.length == 0) return; // not found for(var i=0; i< o.length; i++) this.replace(o[i], FStyle); return; // finished replacing list of elements, exit } o.flirStyle = FStyle; if(typeof FLIR.options.onreplacing == 'function') o = FLIR.options.onreplacing(o, FStyle); o.flirMainObj = true; this.saveObject(o); if(this.findEmbededFonts && typeof this.embededFonts[FStyle.getFont(o, FLIR.getStyle(o, 'font-family'))] != 'undefined') return; // font embedded, skip FLIR.prepare(o); this._replace_tree(o, FStyle); if(typeof FLIR.options.onreplaced == 'function') FLIR.options.onreplaced(o, FStyle); } ,_replace_tree: function(o, FStyle) { var objs = !o.hasChildNodes() || (o.hasChildNodes() && o.childNodes.length==1 && o.childNodes[0].nodeType==3) ? [o] : o.childNodes; var rep_obj; for(var i=0; i < objs.length; i++) { rep_obj = objs[i]; if(typeof FLIR.options.onreplacingchild == 'function') rep_obj = FLIR.options.onreplacingchild(rep_obj, FStyle); if(!rep_obj.innerHTML || rep_obj.nodeType != 1) continue; if(FLIR.isIgnoredEl(rep_obj)) continue; if(rep_obj.flirReplaced) continue; if(FLIR.hoverEnabled && rep_obj.nodeName == 'A' && !rep_obj.flirHasHover) FLIR.addHover(rep_obj); if(rep_obj.hasChildNodes() && (rep_obj.childNodes.length > 1 || rep_obj.childNodes[0].nodeType != 3)) { FLIR.prepare(rep_obj); FLIR._replace_tree(rep_obj, FStyle); continue; } if(rep_obj.innerHTML == '') continue; // skip empty tags, if they exist var op = FStyle.options.output; if(FLIR.isIE6 && (rep_obj.flirIE6PNG = (op == 'png' || (op =='auto' && FLIR.getStyle(rep_obj, 'background-color')=='transparent')))){ // force this method when a transparent png is needed FLIR._Rimg(rep_obj, FStyle, true); }else{ if(FStyle.replaceBackground) FLIR._Rbkg(rep_obj, FStyle); else FLIR._Rimg(rep_obj, FStyle); } rep_obj.className += ' flir-replaced'; rep_obj.flirReplaced = true; if(typeof FLIR.options.onreplacedchild == 'function') FLIR.options.onreplacedchild(o, FStyle); } } ,_Rbkg: function(o, FStyle) { // replace text with background image if(!(args = FLIR.pcall('replaceBackground', arguments))) return; o = args[0]; FStyle = args[1]; var oid = this.saveObject(o); var url = FStyle.URL(o); if(FLIR.options.bkgCheckForBlock) if(FLIR.getStyle(o, 'display') != 'block') o.style.display='block'; var tmp = new Image(); tmp.onload = function() { FLIR.flirElements[oid].style.width=this.width+'px'; FLIR.flirElements[oid].style.height=this.height+'px'; if(FLIR.hoverEnabled && FStyle != FStyle.hoverStyle) { var h_img = new Image(); o.flirHoverURL = h_img.src = FStyle.hoverStyle.URL(o); } }; tmp.src = url; o.style.background = 'url("'+url.replace(/ /g, '%20')+'") no-repeat'; o.flirOrig = url; o.oldTextIndent = o.style.textIndent; o.style.textIndent='-9999px'; } ,_Rimg: function(o, FStyle, bIE6Alpha) { // replace text with an image tag if(!(args = FLIR.pcall('replaceMethodOverlay', arguments))) return; o = args[0]; FStyle = args[1]; var oid = this.saveObject(o); var img = document.createElement('IMG'); var url = FStyle.URL(o); img.alt = o.innerHTML; if(FLIR.hoverEnabled && FStyle != FStyle.hoverStyle) { img.onload = function() { // delay loading of the hover style var h_img = new Image(); o.flirHoverURL = h_img.src = FStyle.hoverStyle.URL(o, img.alt); }; } if(img.onerror) { // revert to text img.onerror = function() { var span = document.createElement('SPAN'); span.innerHTML = img.alt; try { o.replaceChild(span,img) }catch(err) { } }; } img.flirImage = true; img.className = 'flir-image'; img.style.border='none'; if(bIE6Alpha) { img.src = this.options.path+'spacer.png'; if(o.offsetWidth) { img.style.width=o.offsetWidth+'px'; img.style.height=o.offsetHeight+'px'; } img.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+url+'", sizingMethod="image")'; o.flirOrig = url; }else { img.src = url; o.flirOrig = img.src; } o.innerHTML=''; o.appendChild(img); } ,saveObject: function(o) { if(typeof o.flirId == 'undefined') { o.flirId = this.generateUID(); this.flirElements[o.flirId] = o; } return o.flirId; } ,generateUID: function() { var prefix='flir-'; if(typeof __flir_uid_count == 'undefined') __flir_uid_count = 0; else __flir_uid_count++; return prefix+__flir_uid_count; } ,calcDPI: function() { if(screen.logicalXDPI) { var dpi = parseInt(screen.logicalXDPI); }else { var dpicook = document.cookie.match(/(\d+)<\/dpi>/); if(dpicook) { this.dpi = dpicook[1]; //console.info('DPI loaded from cookie'); return; } var test = document.createElement('DIV'); test.style.position='absolute'; test.style.visibility='hidden'; test.style.border=test.style.padding=test.style.margin='0'; test.style.height=test.style.width='1in'; document.body.appendChild(test); var dpi = parseInt(test.offsetHeight); document.body.removeChild(test); var future = new Date(); future.setDate(new Date().getDate()+365); document.cookie = 'dpi='+this.dpi+';expires='+future.toGMTString()+';path=/'; } if(dpi > 0) this.dpi = dpi; } ,isIgnoredEl: function(el) { return ((','+this.options.ignoredEls+',').indexOf(','+el.nodeName+',')>-1); } ,sanitizeHTML: function(html) { return html.replace(/<[^>]+>/g, ''); } ,isFStyle: function(o) { if(!o) return false; return (typeof o.cssMap != 'undefined'); } }; __flirstyle_instances=0; function FLIRStyle(options, hoverStyle) { __flirstyle_instances++; this.uid = __flirstyle_instances; this.replaceBackground = false; this.hoverStyle = hoverStyle && FLIR.isFStyle(hoverStyle) ? hoverStyle : this; // options are sent along with the query string this.options = {}; //these are the default settings for FLIR. If you change a default here, be sure //to also change it in generate.php, otherwise you may run into problems this.defaults = { mode: 'static' // static, wrap, progressive or name of a plugin ,output: 'auto' // png, gif, auto ,fixBaseline: false ,hq: false // use high quality rendering ,css: {} }; // css vals that get passed and their corresponding value parser this.cssMap = { 'background-color' : 'Background' ,'color' : 'Color' ,'font-family' : 'Font' ,'font-size' : 'FontSize' ,'letter-spacing' : 'Measurement' ,'line-height' : 'LineHeight' ,'text-align' : 'Default' ,'font-stretch' : 'Default' ,'font-style' : 'FontStyle' ,'font-variant' : 'Default' ,'font-weight' : 'Weight' ,'opacity' : 'Default' ,'text-decoration' : 'Default' }; for(var i in this.defaults) // set defaults this.options[i] = this.defaults[i]; if(options && typeof options.css == 'string') options.css = this.parse_css_string(options.css); this.loadopts(options); } FLIRStyle.prototype.loadopts = function(options) { for(var i in this.cssMap) this.options['css'][i] = options && options.css && typeof options.css[i] != 'undefined' ? options.css[i] : null; if(typeof this.loadopts_compat == 'function') options = this.loadopts_compat(options); if(typeof options != 'undefined') { for(var i in options) { if(options[i] == null) continue; if(typeof this[i] != 'undefined') { this[i] = options[i]; }else { if(i=='css') for(var csi in options[i]) this.options[i][csi] = options[i][csi]; else this.options[i] = options[i]; } } } }; FLIRStyle.prototype.parse_css_string = function(css) { var props = css.split(';'); var cssobj = {}; var vals; for(var i=0; i < props.length; i++) { if(props[i].indexOf(':') < 0) continue; vals = props[i].split(':'); cssobj[vals[0].replace(/^\s+|\s+$/, '')] = vals[1].replace(/^\s+|\s+$/, ''); } return cssobj; }; // generate a url based on an object FLIRStyle.prototype.URL = function(o) { // [, text] var enc_text = (arguments[1]?arguments[1]:o.innerHTML); var transform = this.options.css['text-transform']; if(transform==null) transform = FLIR.getStyle(o, 'text-transform'); switch(transform) { case 'capitalize': enc_text = enc_text.replace(/\w+/g, function(w){ return w.charAt(0).toUpperCase()+w.substr(1).toLowerCase(); }); break; case 'lowercase': enc_text = enc_text.toLowerCase(); break; case 'uppercase': enc_text = enc_text.toUpperCase().replace(/&[a-z0-9]+;/gi, function(m) { return m.toLowerCase(); }); // keep entities lowercase, numeric don't matter break; } enc_text = this.encodeText(enc_text, o.flirIE6PNG); var url = FLIR.options.path+'generate.php?t='+enc_text+'&h='+o.offsetHeight+'&w='+o.offsetWidth+'&c='+this.flattenCSS(o)+'&d='+FLIR.dpi+'&f='+this.serialize(); if(FLIR.debug) url += '&rand='+(Math.random()*Math.random()); // console.info(url); return url; }; FLIRStyle.prototype.encodeText = function(str, bIE6Png) { str = encodeURIComponent(str.replace(/&/g, '{*A}').replace(/\+/g, '{*P}').replace(/\(/g, '{*LP}').replace(/\)/g, '{*RP}')); if(bIE6Png) str = escape(str); return str; }; FLIRStyle.prototype.serialize = function() { var sdata = ''; for(var i in this.options) { if(i=='css' || this.options[i] == this.defaults[i]) continue; sdata += ',"'+i+'":"'+this.options[i].toString().replace(/"/g, "'")+'"'; } return encodeURIComponent('{'+sdata.substr(1)+'}'); }; FLIRStyle.prototype.flattenCSS = function(o) { var options = this.copyObject(this.options.css); for(var i in this.cssMap) { this.options.css[i] = this.get(o, i, this.cssMap[i]); } var sdata=''; for(var i in this.options.css) { if(this.options.css[i] == null || typeof this.options.css[i] == 'undefined') this.options.css[i] = ''; sdata += '|'+encodeURIComponent(this.options.css[i].toString().replace(/|/g, '')); } sdata = sdata.substr(1); this.options.css = options; return sdata; }; FLIRStyle.prototype.get = function(o, css_property, flirstyle_name) { var func = 'get'+flirstyle_name; while(o.flirSpan && o != document.body) o = FLIR.getParentNode(o); var optprop = this.options.css[css_property]; var val = !optprop || optprop == null ? FLIR.getStyle(o, css_property) : this.options.css[css_property]; var ret = typeof this[func] == 'function' ? this[func](o, val) : val; return ret == 'normal' || ret == 'none' || ret == 'start' ? '' : ret; }; FLIRStyle.prototype.getFontStyle = function(o, val) { return (o.nodeName=='EM' || FLIR.getParentNode(o).nodeName=='EM' ? 'italic' : val) == 'italic' ? '1' : ''; }; FLIRStyle.prototype.getBackground = function(o, val) { if(this.options.output=='gif' && val.search(/^(transparent|none)$/i) > -1) { var p = FLIR.getParentNode(o); var pstyle = FLIR.getStyle(p, 'background-color'); if(typeof __flirstyle_root_obj == 'undefined') __flirstyle_root_obj = FLIR.getParentNode(document.body); while(pstyle.search(/^(transparent|none)$/i) > -1 && p != __flirstyle_root_obj) { p = FLIR.getParentNode(p); pstyle = FLIR.getStyle(p, 'background-color'); } return this.getColor(o, pstyle); }else { return this.getColor(o, val); } }; FLIRStyle.prototype.getWeight = function(o, val) { var fontweight = o.nodeName=='STRONG' || FLIR.getParentNode(o).nodeName=='STRONG' ? 'bold' : val; switch(fontweight.toString()) { case '100': case '200': case '300': case 'lighter': return '-1'; case '400': case 'normal': return ''; case '500': case '600': case '700': case 'bold': return '1'; case '800': case '900': case 'bolder': return '2'; } }; FLIRStyle.prototype.getLineHeight = function(o, val) { var lh = this.getMeasurement(o, val)/o.flirFontSize; return Math.round((lh*100000))/100000; }; FLIRStyle.prototype.getFont = function(o, val) { if(val.indexOf(',')) val = val.split(',')[0]; return val.replace(/['"]/g, '').toLowerCase(); }; FLIRStyle.prototype.getColor = function(o, val) { switch(val) { case 'transparent': case 'none': return ''; default: if(val.substr(0, 1)=='#') val = val.substr(1); return val.replace(/['"\(\) ]|rgba?/g, '').toLowerCase(); } }; FLIRStyle.prototype.getFontSize = function(o, val) { var px = this.getMeasurement(o, val, true); var prepx = px; // fix this... need to make it detect which property is being retrieved and change the final val based on the setting in.css if('*/+-'.indexOf(val[0])>-1) { try { px = Math.round( (parseFloat(eval(px.toString().concat(val)))) *10000)/10000; }catch(err) { px = 16; } } o.flirFontSize = px; return px; }; FLIRStyle.prototype.getMeasurement = function(o, val, bFontSize) { var px,em,prcnt; if(val == 'normal' || val == 'none') return ''; if(val.indexOf('px') > -1) { px = Math.round(parseFloat(val)); }else if(val.indexOf('pt') > -1) { var pts = parseFloat(val); px = pts/(72/FLIR.dpi); }else if((em = (val.indexOf('em') > -1)) || (prcnt = (val.indexOf('%') > -1))) { if(!o.flirFontSize) { var test = document.createElement('DIV'); test.style.padding = test.style.border = '0'; test.style.position='absolute'; test.style.visibility='hidden'; if(bFontSize) test.style.lineHeight = '100%'; test.innerHTML = 'FlirTest'; o.appendChild(test); px = test.offsetHeight; o.removeChild(test); }else { px = o.flirFontSize; } } return px; }; FLIRStyle.prototype.copyObject = function(obj) { var copy = {}; for(var i in obj) { copy[i] = obj[i]; } return copy; }; FLIRStyle.prototype.toString = function() { return this.uid; }; // enable hover support FLIR.addHover = function(obj) { if(!(args = FLIR.pcall('addHover', arguments))) return; obj = args[0]; obj.flirHasHover = true; if(obj.addEventListener) { obj.addEventListener( 'mouseover', FLIR.hover, false ); obj.addEventListener( 'mouseout', FLIR.hover, false ); }else if (obj.attachEvent) { obj.attachEvent( 'onmouseover', function() { FLIR.hover( window.event ); } ); obj.attachEvent( 'onmouseout', function() { FLIR.hover( window.event ); } ); } }; // auto CSS hover detection. IE takes a helluva lot of extra work to get the current style of an element being hovered FLIR.flirIERepObj = []; FLIR.flirIEHovEls = []; FLIR.flirIEHovStyles = []; FLIR.hover = function(e) { //console.log('hover'); var o=FLIR.evsrc(e); var targ=o; var targDescHover = o.flirHasHover; var hoverTree = o; var on = (e.type == 'mouseover'); while(o != document.body && !o.flirMainObj) { o = FLIR.getParentNode(o); if(!targDescHover) { targDescHover = o.flirHasHover; hoverTree = o; } } if(o==document.body) return; var FStyle = o.flirStyle; if(on && FStyle != FStyle.hoverStyle) FStyle = FStyle.hoverStyle; if(!(args = FLIR.pcall('hover', [ on, targ, o, hoverTree ]))) return; on = args[0]; targ = args[1]; o = args[2]; hoverTree = args[3]; var objs = FLIR.getChildren(hoverTree); if(objs.length == 0 || (objs.length == 1 && (objs[0].flirImage || objs[0].flirHasHover))) { objs = [hoverTree]; }else if(objs.length == 1 && !FLIR.isIgnoredEl(objs[0])) { var subobjs = FLIR.getChildren(objs[0]); if(subobjs.length > 0) if((subobjs.length==1 && !subobjs[0].flirImage) || subobjs.length > 1) objs = subobjs; } var rep_obj; for(var i=0; i < objs.length; i++) { rep_obj = objs[i]; if(rep_obj.nodeName == 'IMG') continue; if(!rep_obj.innerHTML) continue; // IE if(FLIR.isIE) { var idx = FLIR.flirIEHovEls.length; FLIR.flirIERepObj[idx] = rep_obj; FLIR.flirIEHovStyles[idx] = FStyle; var op = FStyle.options.output; if(FLIR.isIE6 && (rep_obj.flirIE6PNG = (op == 'png' || (op =='auto' && FLIR.getStyle(rep_obj, 'background-color')=='transparent')))){ // transparent png FLIR.flirIEHovEls[idx] = rep_obj.flirImage ? rep_obj : FLIR.getChildren(rep_obj)[0]; setTimeout('FLIR.flirIEHovEls['+idx+'].style.filter = \'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="\'+FLIR.flirIEHovStyles['+idx+'].URL(FLIR.flirIERepObj['+idx+'], FLIR.flirIEHovEls['+idx+'].alt)+\'", sizingMethod="image")\'; ', 0); }else { if(FStyle.replaceBackground && FLIR.getStyle(rep_obj, 'display') == 'block') { FLIR.flirIEHovEls[idx] = rep_obj; setTimeout('FLIR.flirIERepObj['+idx+'].style.background = "url("+('+on+' ? FLIR.flirIEHovStyles['+idx+'].URL(FLIR.flirIERepObj['+idx+']) : FLIR.flirIERepObj['+idx+'].flirOrig)+") no-repeat";', 0); }else { FLIR.flirIEHovEls[idx] = rep_obj.flirImage ? rep_obj : FLIR.getChildren(rep_obj)[0]; if(!FLIR.flirIEHovEls[idx].flirOrigWidth) { FLIR.flirIEHovEls[idx].flirOrigWidth = FLIR.flirIEHovEls[idx].width; FLIR.flirIEHovEls[idx].flirOrigHeight = FLIR.flirIEHovEls[idx].height; } var ie_js = 'FLIR.flirIEHovEls['+idx+'].src = '+on+' ? FLIR.flirIEHovStyles['+idx+'].URL(FLIR.flirIERepObj['+idx+'], FLIR.flirIEHovEls['+idx+'].alt) : FLIR.flirIERepObj['+idx+'].flirOrig;' ie_js += 'FLIR.flirIEHovEls['+idx+'].onload = function() { '; if(on && !FLIR.flirIEHovEls[idx].flirHoverWidth) { ie_js += ' FLIR.flirIEHovEls['+idx+'].flirHoverWidth = this.width; '; ie_js += ' FLIR.flirIEHovEls['+idx+'].flirHoverHeight = this.height; '; } ie_js += ' this.style.width = FLIR.flirIEHovEls['+idx+'].'+(on?'flirHoverWidth':'flirOrigWidth')+'+"px"; '; ie_js += ' this.style.height = FLIR.flirIEHovEls['+idx+'].'+(on?'flirHoverHeight':'flirOrigHeight')+'+"px"; '; ie_js += '}; '; setTimeout(ie_js, 0); } } }else { if(FStyle.replaceBackground) { var hovURL = rep_obj.flirHoverURL ? rep_obj.flirHoverURL : FStyle.URL(rep_obj); rep_obj.style.background='url('+(on?hovURL:rep_obj.flirOrig)+') no-repeat'; }else { var img = rep_obj.flirImage ? rep_obj : FLIR.getChildren(rep_obj)[0]; var hovURL = rep_obj.flirHoverURL ? rep_obj.flirHoverURL : FStyle.URL(rep_obj, img.alt); img.src = on?hovURL:rep_obj.flirOrig; } } } }; /** FLIR replacable functions */ // FLIR defaults FLIR.detectBrowser = function() { FLIR.isIE = (navigator.userAgent.toLowerCase().indexOf('msie')>-1 && !window.opera); FLIR.isIE6 = (typeof document.body.style.maxHeight=='undefined'); }; FLIR.getElements = function(tag) { var found = []; if(document.querySelectorAll) { var qsa = false; try{ found = document.querySelectorAll(tag); qsa = true; }catch(err){ qsa=false; } if(qsa) return found; } var objs,subels,cn,childs,tag,el,matches,subel,rep_el; el = tag; subel=false; if(el.indexOf(' ')>-1) { var parts = el.split(' '); el = parts[0]; subel = parts[1]; }else if(el.substr(0,1) == '#') { return document.getElementById(el.substr(1)); } var grain_id=false; if(el.indexOf('#') > -1) { grain_id = el.split('#')[1]; tag = el.split('#')[0]; } var grain_cn=false; if(el.indexOf('.') > -1) { grain_cn = el.split('.')[1]; tag = el.split('.')[0]; } objs = document.getElementsByTagName(tag); for(var p=0; p -1) prop = prop.split('-')[0]+prop.split('-')[1].substr(0, 1).toUpperCase()+prop.split('-')[1].substr(1); var y = el.currentStyle[prop]; }else if(window.getComputedStyle) { var y = document.defaultView.getComputedStyle(el,'').getPropertyValue(prop); } return y; }; FLIR.getChildren = function(n) { var children=[]; if(n && n.hasChildNodes()) for(var i in n.childNodes) if(n.childNodes[i] && n.childNodes[i].nodeType == 1) children[children.length]=n.childNodes[i]; return children; }; FLIR.getParentNode = function(n) { var o=n.parentNode; while(o != document && o.nodeType != 1) o=o.parentNode; return o; }; FLIR.hasClass = function(o, cn) { return (o && o.className && o.className.indexOf(cn)>-1); }; FLIR.evsrc = function(e) { var o; if (e.target) o = e.target; else if (e.srcElement) o = e.srcElement; if (o.nodeType == 3) // defeat Safari bug o = o.parentNode; return o; }; FLIRStyle.prototype.loadopts_compat = function(options) { if(!options) return; if(!options.css) options.css = {}; options.fixedBaseline = options.realFontHeight ? true : false; var css_compat = { cBackground : 'background-color' ,cColor : 'color' ,cFont : 'font-family' ,cSize : 'font-size' ,cSpacing : 'letter-spacing' ,cLine : 'line-height' ,cAlign : 'text-align' ,cTransform : 'text-transform' ,cStretch : 'font-stretch' ,cFontStyle : 'font-style' ,cVariant : 'font-variant' ,cWeight : 'font-weight' ,cOpacity : 'opacity' ,cDecoration : 'text-decoration' }; var modval; for(var i in css_compat) { if(typeof options[i] != 'undefined') { switch(i) { default: modval = options[i]; break; case 'cSize': modval = options[i]+'px'; break; case 'cColor': case 'cBackground': modval = '#'+options[i]; break; } options.css[css_compat[i]] = modval; options[i] = null; } } return options; }; FLIR.auto = function(els) { FLIR.replace((!els ? ['h1','h2','h3','h4','h5']: (els.indexOf && els.indexOf(',')>-1?els.split(','):els) )); }