function FlashTML(minVersion, source, width, height){
	var self = this; 
	var baseElement = document.createElement("div");
	var options = arguments[4] || {};
	var winIE = ((navigator.appVersion.toLowerCase().indexOf("win")!=-1) && (navigator.appName=="Microsoft Internet Explorer"));
	var idCount = FlashTML.idCount++;
	var namespaceAdded = false;
	var namespaceName = "flashtml";
	var namespaceURN = "http://www.featureblend.com/2007/flashtml/";
	self.domTemplate = "";
	self.innerHTML = "";
	self.xhtml = "";
	self.inDocumentElement = "";
	var getCabVersion = function(minVersion){
		return minVersion + ",0,0,0";//B+
	};
	var getNameValueAttrFromOptions = function(name){
		return (typeof options[name] != "undefined")?getNameValueAttributes(name, options[name].toString()):"";
	};
	var getNameValueAttributes = function(name, value){
		return {
			"@name":name,
			"@value":value
		};
	};
	var createElementFromRule = function(name, target){
		var newElement = safeCreateElement(name.replace("#",""));
		return target.appendChild(newElement);
	};
	var getID = function(){
		return options.id || FlashTML.idPattern + idCount;
	};
	var setAttributeFromRule = function(name, value, target){
		target.setAttribute(name.replace("@",""), value);
	};
	var safeCreateElement = function(name){
		if((name=="object" || name=="param") && document.namespaces){
			if(!namespaceAdded){
				document.namespaces.add(namespaceName, namespaceURN);
				namespaceAdded = true;
			}
			return document.createElement(namespaceName + ":" + name);
		}else{
			return document.createElement(name);
		}
	};
	var htmlTidy = function(str){
		str = str.replace(/<\?xml([^>]*)>/, "");
		str = str.replace(eval("/"+namespaceName+":/g"),"");
		str = str.replace(/><\/param>/g,">");
		str = str.replace(/(<param )(.*?)(>)/g, "<param $2 \/>");
		return str;
	};
	var parseRules = function(position, target){
		for(var i in position){
			if(i.charAt(0)=="#"){
				var appendedElement;
				if(typeof position[i] == "object" && position[i].length){
					for(var j=0; j<position[i].length; j++){
						if(position[i][j]()!==""){
							appendedElement = createElementFromRule(i, target);
							parseRules(position[i][j](), appendedElement);
						}
					}
				}else if(typeof position[i]=="function" && position[i]()!==""){
					appendedElement = createElementFromRule(i, target);
					parseRules(position[i](), appendedElement);
				}
			}else if(i.charAt(0)=="@"){
				if(typeof position[i]=="function" && position[i]()!==""){
					setAttributeFromRule(i, position[i](), target);
				}else if(typeof position[i] == "string"){
					setAttributeFromRule(i, position[i], target);
				}
			}
		}
	};
	var structuralRules = {
	    "#object":function(){
	    	return {
	    		"@type":function(){
	    			return (!winIE)?"application/x-shockwave-flash":"";
	    		},
		    	"@codebase":function(){
		    		return (winIE)?"http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab#version="+getCabVersion(minVersion):"";
		    	},
		    	"@classid":function(){
		    		return (winIE)?"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000":"";
		    	},
		    	"@data":function(){
		    		return (!winIE)?source:"";
		    	},
		    	"@width":function(){
		    		return width.toString();
		    	},
		    	"@height":function(){
		    		return height.toString();
		    	},
		    	"@id":function(){
		    		return getID();
		    	},
				"@tabindex":function(){
					return options.tabindex || "";
				},
		    	"#param":[
		    		function(){
		    			return (winIE)?getNameValueAttributes("movie", source):"";
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("allowfullscreen");
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("allowscriptaccess");
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("allownetworking");
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("swliveconnect");
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("play");
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("loop"); 
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("menu"); 
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("quality"); 
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("scale"); 
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("align"); 
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("salign"); 
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("wmode"); 
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("bgcolor");
		    		},
		    		function(){
		    			return getNameValueAttrFromOptions("base");
		    		},
		    		function(){
		    			var result = "";
		    			if(options.flashvars){
		    				var flashVarsStr = (typeof options.flashvars == "object")?FlashTML.getQueryStrFromObj(options.flashvars):options.flashvars;
		    				result = getNameValueAttributes("flashvars", flashVarsStr);
		    			}
		    			return result;
		    		}
		    	]
	    	};
	    }
	};
	self.append = function(target){
		return addToElement(target, false);
	};
	self.replace = function(target){
		return addToElement(target, true);
	};
	var addToElement = function(target, replace){
		var result = false;
		var targetObj = (typeof target=="object")?target:document.getElementById(target);
		if(!self.inDocumentElement){
			if(winIE){
				if(replace){
					targetObj.innerHTML = self.xhtml;
				}else{
					targetObj.innerHTML += self.xhtml;
				}
				self.inDocumentElement = document.getElementById(getID());
				window.attachEvent("onunload", self.garbageCollection);
			}else{
				if(replace){
					while (targetObj.firstChild) {
					  targetObj.removeChild(targetObj.firstChild);
					}					
				}
				self.inDocumentElement = targetObj.appendChild(baseElement.childNodes[0]);
			}
			result = self.inDocumentElement;
		}
		return result;
	};
	self.garbageCollection = function(){
		if(winIE && self.inDocumentElement){
			self.inDocumentElement = null;
		}
	};
	self.FlashTML = function(){
		parseRules(structuralRules, baseElement);
		self.domTemplate = baseElement.childNodes[0];
		self.innerHTML = baseElement.innerHTML;
		self.xhtml = htmlTidy(self.innerHTML);
	}();
}
FlashTML.getQueryStrFromObj = function(nameValue){
	var str = "";
	for(var i in nameValue){
		if(nameValue.hasOwnProperty(i)){
			str += (encodeURI(i) + "=" + encodeURI(nameValue[i]) + "&");
		}
	}
	return str.substring(0, str.length-1);
};
FlashTML.idCount = 0;
FlashTML.idPattern = "__FlashTML_";
FlashTML.release = "1.0.2";

function NiftyCheck() {
  if(!document.getElementById || !document.createElement) {
    return false;
  }
  var b = navigator.userAgent.toLowerCase();
  if (b.indexOf("msie 5") > 0 && b.indexOf("opera") == -1) {
    return false;
  }
  return true;
}

function Rounded(className, sizex, sizey, sizex_b, sizey_b) {
	var bk;
	if (!NiftyCheck()) return;
	if (typeof(sizex_b) == 'undefined')
		sizex_b = sizex;
	if (typeof(sizey_b) == 'undefined')
		sizey_b = sizey;
	var v = getElements(className);
	var l = v.length;
	for (var i = 0; i < l; i++) {
		color = get_current_style(v[i],"background-color","transparent");
		bk = get_current_style(v[i].parentNode,"background-color","transparent");
		AddRounded(v[i], bk, color, sizex, sizey, true);
		AddRounded(v[i], bk, color, sizex_b, sizey_b, false);
	}
}

Math.sqr = function (x) {
  return x*x;
};

function Blend(a, b, alpha) {

  var ca = Array(
    parseInt('0x' + a.substring(1, 3)), 
    parseInt('0x' + a.substring(3, 5)), 
    parseInt('0x' + a.substring(5, 7))
  );
  var cb = Array(
    parseInt('0x' + b.substring(1, 3)), 
    parseInt('0x' + b.substring(3, 5)), 
    parseInt('0x' + b.substring(5, 7))
  );
  return '#' + ('0'+Math.round(ca[0] + (cb[0] - ca[0])*alpha).toString(16)).slice(-2).toString(16)
             + ('0'+Math.round(ca[1] + (cb[1] - ca[1])*alpha).toString(16)).slice(-2).toString(16)
             + ('0'+Math.round(ca[2] + (cb[2] - ca[2])*alpha).toString(16)).slice(-2).toString(16);

  return '#' + ('0'+Math.round(ca[0] + (cb[0] - ca[0])*alpha).toString(16)).slice(-2).toString(16)
             + ('0'+Math.round(ca[1] + (cb[1] - ca[1])*alpha).toString(16)).slice(-2).toString(16)
             + ('0'+Math.round(ca[2] + (cb[2] - ca[2])*alpha).toString(16)).slice(-2).toString(16);
}

function AddRounded(el, bk, color, sizex, sizey, top) {
  if (!sizex && !sizey)
	return;
  var i, j;
  var d = document.createElement("div");
  d.style.backgroundColor = bk;
  var lastarc = 0;
  for (i = 1; i <= sizey; i++) {
    var coverage, arc2, arc3;
    // Find intersection of arc with bottom of pixel row
    arc = Math.sqrt(1.0 - Math.sqr(1.0 - i / sizey)) * sizex;
    // Calculate how many pixels are bg, fg and blended.
    var n_bg = sizex - Math.ceil(arc);
    var n_fg = Math.floor(lastarc);
    var n_aa = sizex - n_bg - n_fg;
    // Create pixel row wrapper
    var x = document.createElement("div");
    var y = d;
    x.style.margin = "0px " + n_bg + "px";
	x.style.height='1px';
	x.style.overflow='hidden';
    // Make a wrapper per anti-aliased pixel (at least one)
    for (j = 1; j <= n_aa; j++) {
      // Calculate coverage per pixel
      // (approximates circle by a line within the pixel)
      if (j == 1) {
        if (j == n_aa) {
          // Single pixel
          coverage = ((arc + lastarc) * .5) - n_fg;
        }
        else {
          // First in a run
          arc2 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j + 1) / sizex)) * sizey;
          coverage = (arc2 - (sizey - i)) * (arc - n_fg - n_aa + 1) * .5;
          // Coverage is incorrect. Why?
          coverage = 0;
        }
      }
      else if (j == n_aa) {
        // Last in a run
        arc2 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j + 1) / sizex)) * sizey;
        coverage = 1.0 - (1.0 - (arc2 - (sizey - i))) * (1.0 - (lastarc - n_fg)) * .5;
      }
      else {
        // Middle of a run
        arc3 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j) / sizex)) * sizey;
        arc2 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j + 1) / sizex)) * sizey;
        coverage = ((arc2 + arc3) * .5) - (sizey - i);
      }
      
      x.style.backgroundColor = Blend(bk, color, coverage);
	  if (top)
	      y.appendChild(x);
      else
	      y.insertBefore(x, y.firstChild);
      y = x;
      var x = document.createElement("div");
		x.style.height='1px';
		x.style.overflow='hidden';
      x.style.margin = "0px 1px";
    }
    x.style.backgroundColor = color;
    if (top)
	    y.appendChild(x);
    else
		y.insertBefore(x, y.firstChild);
    lastarc = arc;
  }
  if (top)
	  el.insertBefore(d, el.firstChild);
  else
	  el.appendChild(d);
}

function getElements(className) {
	var elements = [];
	var el = document.getElementsByTagName('DIV');  
	var regexp=new RegExp("\\b"+className+"\\b");
	for (var i = 0; i < el.length; i++) 
	{
		if (regexp.test(el[i].className)) 
			elements.push(el[i]);
	}
	return elements;
}

function get_current_style(element,property,not_accepted)
{
  var ee,i,val,apr;
  try
  {
    var cs=document.defaultView.getComputedStyle(element,'');
    val=cs.getPropertyValue(property);
  }
  catch(ee)
  {
    if(element.currentStyle)
  	{
	    apr=property.split("-");
	    for(i=1;i<apr.length;i++) apr[i]=apr[i].toUpperCase();
	    apr=apr.join("");
	    val=element.currentStyle.getAttribute(apr);
   }
  }
  if((val.indexOf("rgba") > -1 || val==not_accepted) && element.parentNode)
  {
	 if(element.parentNode != document) 
		 val=get_current_style(element.parentNode,property,not_accepted);
	 else
		 val = '#FFFFFF';
  }
  if (val.indexOf("rgb") > -1 && val.indexOf("rgba") == -1)
	  val = rgb2hex(val);
  if (val.length == 4)
	  val = '#'+val.substring(1,1)+val.substring(1,1)+val.substring(2,1)+val.substring(2,1)+val.substring(3,1)+val.substring(3,1);
  return val;
}

function rgb2hex(value)
{
	var x = 255;
	var hex = '';
	var i;
	var regexp=/([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)/;
	var array=regexp.exec(value);
	for(i=1;i<4;i++) hex += ('0'+parseInt(array[i]).toString(16)).slice(-2);
	return '#'+hex;
}

function enableTooltips(id){
var links,i,h;
if(!document.getElementById || !document.getElementsByTagName) return;
AddCss();
h=document.createElement("bdo");
h.id="btc";
h.setAttribute("id","btc");
h.style.position="absolute";
document.getElementsByTagName("body")[0].appendChild(h);
if(id==null) links=document.getElementsByTagName("bdo");
else links=document.getElementById(id).getElementsByTagName("bdo");
for(i=0;i<links.length;i++){
    Prepare(links[i]);
    }
}

function Prepare(el){
var tooltip,t,b,s,l;
t=el.getAttribute("title");
if(t==null || t.length==0) t="link:";
el.removeAttribute("title");
tooltip=CreateEl("bdo","tooltip");
s=CreateEl("bdo","top");
s.appendChild(document.createTextNode(t));
tooltip.appendChild(s);
b=CreateEl("b","bottom");
l=el.getAttribute("href");
b.appendChild(document.createTextNode(""));
tooltip.appendChild(b);
setOpacity(tooltip);
el.tooltip=tooltip;
el.onmouseover=showTooltip;
el.onmouseout=hideTooltip;
el.onmousemove=Locate;
}

function showTooltip(e){
document.getElementById("btc").appendChild(this.tooltip);
Locate(e);
}

function hideTooltip(e){
var d=document.getElementById("btc");
if(d.childNodes.length>0) d.removeChild(d.firstChild);
}

function setOpacity(el){
el.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='blank.gif')";
el.style.KHTMLOpacity="0.95";
el.style.MozOpacity="0.95";
el.style.opacity="0.95";
}

function CreateEl(t,c){
var x=document.createElement(t);
x.className=c;
x.style.display="block";
return(x);
}

function AddCss(){
var l=CreateEl("link");
l.setAttribute("type","text/css");
l.setAttribute("rel","stylesheet");
l.setAttribute("href","bt.css");
l.setAttribute("media","screen");
document.getElementsByTagName("head")[0].appendChild(l);
}

function Locate(e){
var posx=0,posy=0;
if(e==null) e=window.event;
if(e.pageX || e.pageY){
    posx=e.pageX; posy=e.pageY;
    }
else if(e.clientX || e.clientY){
    if(document.documentElement.scrollTop){
        posx=e.clientX+document.documentElement.scrollLeft;
        posy=e.clientY+document.documentElement.scrollTop;
        }
    else{
        posx=e.clientX+document.body.scrollLeft;
        posy=e.clientY+document.body.scrollTop;
        }
    }
document.getElementById("btc").style.top=(posy+10)+"px";
document.getElementById("btc").style.left=(posx-20)+"px";
}
