
// browser sniffer
function Browser(){
  this.uA = navigator.userAgent.toLowerCase();
  this.aN = navigator.appName.toLowerCase();
  this.iE = this.aN.indexOf('microsoft') != -1 ? 1 : 0;
  this.mac =  this.uA.indexOf('mac') != -1 ? 1 : 0;
  this.win = this.uA.indexOf('windows') != -1 ? 1 : 0;
  this.safari =  this.uA.indexOf('webkit') != -1 ? 1 : 0;
  this.opera =  this.uA.indexOf('opera') != -1 ? 1 : 0;    
  this.mozilla = this.aN.indexOf('netscape') != -1 && !this.safari ? 1 : 0;
  this.winMozilla = this.mozilla && this.win ? 1 : 0;
  this.winIE = this.iE && this.win && !this.opera ? 1 : 0;
  this.winIE6Down = this.winIE && parseInt(this.uA.split('msie ')[1].substring(0,1)) <= 6 ? 1: 0;
  this.macIE = this.iE && this.mac ? 1 : 0;
};
var browser = new Browser();


// getElementById wrapper
if (typeof document.getElementById != 'undefined'){
  var getEl = function(id){
    var el = document.getElementById(id);
    if (!el){
      error('elById: element width id "' + id + '" not found in DOM');
      return false;
    }
    return(el);
  };
}
else {
  error('document.getElementById not supported');
}


// array for DOMContentLoaded events
var DOMCLEvents = [];  
var executeDOMCLEvents = function(){
  if(DOMCLEvents.preventExecution){
    return;
  }
  DOMCLEvents.preventExecution = true;
  for (var i = 0; i < DOMCLEvents.length; i++){
    DOMCLEvents[i]();
  }
};

// event listening
if (window.addEventListener){
  var addEvent = function(obj, eventType, functionName){
    if (eventType == 'DOMContentLoaded'){
      DOMCLEvents[DOMCLEvents.length] = functionName;
    }
    obj.addEventListener(eventType, functionName, false);
    return true;
  };
  if (/WebKit/i.test(navigator.userAgent)){ //for safari
    var _timer = setInterval(function() {
    if (/loaded|complete/.test(document.readyState)) {            
    clearInterval(_timer); executeDOMCLEvents();}}, 10);
  };
  addEvent(window,'load',executeDOMCLEvents); //for opera < 9, ..
  addEvent(window,'DOMContentLoaded',function(){DOMCLEvents.preventExecution = true;}); //not for firefox
}
else if(window.attachEvent && Function.apply){ //for ie 5.5+
  var addEvent = function(obj, eventType, functionName){
    if (eventType == 'DOMContentLoaded'){
      DOMCLEvents[DOMCLEvents.length] = functionName;
      return true;
    }
    var r = obj.attachEvent("on"+eventType, function() { functionName.apply(obj); });
    return r;
  };
  document.write('<script type="text/javascript" id="__ie_onload" defer="defer" src="javascript:void(0);"><\/script>');
  var script = document.getElementById("__ie_onload");
  script.onreadystatechange = function() {
    if (this.readyState == "complete") {
      executeDOMCLEvents();
    }
  }
}
else {
  error("event handling not supported");
}


// get cookies
function setCookie(cookieName,cookieValue,nDays) {
  var today = new Date();
  var expire = new Date();
  if (nDays==null || nDays==0) nDays=1;
  expire.setTime(today.getTime() + 3600000*24*nDays);
  document.cookie = cookieName+"="+escape(cookieValue) + ";expires="+expire.toGMTString()+";path=/";
};


// set cookie
function getCookie(c_name){
  if (document.cookie.length>0){
    c_start=document.cookie.indexOf(c_name + "=");
    if (c_start!=-1){ 
      c_start=c_start + c_name.length+1 
      c_end=document.cookie.indexOf(";",c_start);
      if (c_end==-1) 
        c_end=document.cookie.length;
      return unescape(document.cookie.substring(c_start,c_end));
    } 
  }
  return null;
};


// get src Element
function getTarget(e,to){
  if (window.event){
    var t = to ? window.event.toElement : window.event.srcElement;
  }
  else if (e){
    var t = to ? e.relatedTarget : e.target;
  }
  if (t == null){
    window.body;
  }  
  return t;
};


// event on part of element
function eventOnPartOfElement(e,element,to){
  var t;
  if (window.event){
    t = to ? window.event.toElement : window.event.srcElement;
  }
  else if (e){
    t = to ? e.relatedTarget : e.target;
  } 
  else {
    return false;
  }
  if (t == null){
    return false;
  }
  while (t.tagName != 'BODY' && t.tagName != 'HTML'){
    if (t == element){
      return true;
    }
    t = t.parentNode;
  }
  return false;
};


// setInlineStyle 
function setInlineStyle(el,cssText){
  if (!cssText){
    return;
  }
  var elStyle = el.getAttribute('style');
  if (elStyle){
    elStyle.setAttribute('cssText',cssText);
  }
  else {
    el.setAttribute('style',cssText);
  }
};


// handy trace
function trace(str){
  var el = getEl('trace');
  if (!el){
    return;
  }
  el.value = str;
};


// error
function error (str){

}


// getElementsByCSSSelector
function getElementsByCSSSelector(selector,pN){
  var els = [];
  var iterator = 0;
  var pNs = pN;
  if (!pNs){
    pNs = Array(document);
  }
  var selectorArr = selector.split(' ');
  var cN = false;
  var currSelector = selectorArr[0];
  if (currSelector.indexOf('#') != -1){
    var elFromId  = document.getElementById(currSelector.split('#')[1]);
    if (!elFromId){
      return els;
    }
    els[0] = elFromId;
  }
  else {
    if (currSelector.indexOf('.') != -1){
      var currSelectorArr = currSelector.split('.');
      currSelector = currSelectorArr[0];
      cN = currSelectorArr[1];
      
    }
    for (var i = 0; i < pNs.length; i++){
      var elsFromTN = pNs[i].getElementsByTagName(currSelector);
      for (var j = 0; j < elsFromTN.length; j++){
        var matchedClassNames = true;
        if (cN){
          for (var k = 1; k < currSelectorArr.length; k++){
            var elCN = elsFromTN[j].className.split(' ');
            for (var l = 0; l < elCN.length; l++){
              matchedClassNames = false;
              if (currSelectorArr[k] == elCN[l]){
                matchedClassNames = true;
                //alert(elCN);
                break;
              }
            }
            if (matchedClassNames){
              continue;
            }
          }
        }
        if (!matchedClassNames){
          continue;
        }
        els[iterator] = elsFromTN[j];
        iterator++;
      }
    }
    if (iterator == 0){
      return [];
    }        
  }

  if (selectorArr.length == 1){
    return els;
  }
  var s = '';
  var space = '';
  for (var i = 1; i < selectorArr.length; i++){
    s += space + selectorArr[i];
    space = ' ';
  }
  return getElementsByCSSSelector(s,els);
};


// add stylesheet
var styleSheetFromScript = false;
function addStyle(selector,properties){
  if (document.styleSheets) {
    if (!styleSheetFromScript){
      styleSheetFromScript = document.createElement('style');
      styleSheetFromScript.setAttribute('type','text/css');
      document.getElementsByTagName('HEAD')[0].appendChild(styleSheetFromScript);
    }

    var lastSheet = document.styleSheets[document.styleSheets.length - 1];
    if(lastSheet && typeof lastSheet.addRule == 'object'){
      lastSheet.addRule(selector, properties);
      //status = 'ie'; 
      //alert(selector);
    }
    else {
      styleSheetFromScript.appendChild(document.createTextNode(selector + ' { ' + properties + ' }'));
      //status = 'iedd'; 
    }
  }
};


/*************************
flash adapted for this project, see wiki for last version, mdi 1.1
*************************/

// check if the proper version is installed
function hasMinFlashVersion(versionNumber){
  var versionInCache = hasMinFlashVersion.prototype.cache[versionNumber];
  if (versionInCache != undefined){
    return versionInCache;
  }
  var versionFound = false;
  if (window.ActiveXObject){
    try{
      var flash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + versionNumber);
      versionFound = true;
    }
    catch(e){
      versionFound = false;
    }
  }
  else {
    if(navigator.plugins.length){
      for (var i=0; i < navigator.plugins.length; i++){
        var pluginIdent = navigator.plugins[i].description.split(" ");
        if(pluginIdent[0] == "Shockwave" && pluginIdent[1] == "Flash"){
          var versionArray = pluginIdent[2].split(".");
          versionFound = versionArray[0] >= versionNumber;
        }
      }   
    }
  }
  //alert(versionFound);
  hasMinFlashVersion.prototype.cache[versionNumber] = versionFound;
  return versionFound;
};

hasMinFlashVersion.prototype.cache = [];

// Class FlashObject
flashObjects = [];
function FlashObject(oArg){

  this.hasRequiredVersion = hasMinFlashVersion(oArg.requiredVersion);
  
  this.id = oArg.id;
  this.parentId = oArg.parentId;      
  this.uri = oArg.uri;
  this.width = oArg.width ? 'width:' + oArg.width + 'px;' : '';
  this.height = oArg.height ? 'height:' + oArg.height + 'px;' : '';
  
  this.className = oArg.className ? oArg.className : '';
  this.params = oArg.params;
  this.noFocus = oArg.noFocus;
	this.inlineStyle = oArg.inlineStyle ? oArg.inlineStyle : '';
  if (this.hasRequiredVersion && (oArg.alternateContent == undefined)){ //FIXME??
    addStyle('#' + oArg.parentId + ' .alternate-content','display:none !important;');
  }
  
  // create the object
  this.create = function(){
    if ((!this.hasRequiredVersion) || (!getEl(this.parentId))){
      return;
    }
    var obj = document.createElement('object');
    obj.setAttribute('type','application/x-shockwave-flash');
    if (this.id){
      obj.setAttribute('id',this.id);
    }
    obj.setAttribute('data',this.uri);
    obj.setAttribute('src',this.uri);
     
    setInlineStyle(obj,'display:block;' + this.width + this.height + this.inlineStyle);
    if (this.noFocus){
      obj.setAttribute('tabIndex',-1);
    }
    obj.className = this.className;
    for (var i in this.params){
      var param = document.createElement('param');
      param.setAttribute('name',i);
      param.setAttribute('value',this.params[i]);
      obj.appendChild(param);
      obj.setAttribute(i,this.params[i]);
    };
    var title = document.title;
    getEl(this.parentId).appendChild(obj);
    document.title = title;
    
    try {
      obj.loadMovie(0,this.uri);
    }
    catch (e){
    }
  }
  
};

// make a flash object
function createFlashObject(oArg){
  flashObjects[flashObjects.length] = new FlashObject(oArg);
};

// create all the flash objects (onload)
function createFlashObjects(){
  for (var i in flashObjects){
    flashObjects[i].create();
  }
};

/*************************
end flash 
*************************/



/*************************
flash header, mdi 2.2
  dependencies:
  - function getEl
  - function createFlashObject
  - function createFlashObjects
  - function hasMinFlashVersion
  - Object Browser
  - Object FlashObject
*************************/

function FlashHeaders(){

  // instance variables
  this.path;
  this.calibrationId;
  this.calibrationHeight;
  this.currentCalibrationHeight;
  this.hasFlash6up;
  this.hasFlash8up;
  this.headers = [];
  this.replacements = [];
  this.maxId = 0;
  
  //statics
  this.HGNAME = 'hg.swf';
  this.ACTIVEXTESTNAME = 'activeXTest.swf';
  
  // start
  this.start = function(oArg){
  
    //checks
    var protocol = window.location.href.split('://')[0];
    if(protocol != 'http' && protocol != 'https'){
      return;
    }
    this.hasFlash6up = hasMinFlashVersion(6);
    if (!this.hasFlash6up || browser.macIE || browser.opera){ // not minimal version, buggy ie5 mac, TODO:Opera
      return;
    }
    
    this.hasFlash8up = hasMinFlashVersion(8);
    this.path = oArg.path;
    this.calibrationId = oArg.calibrationId;
    this.calibrationHeight = oArg.calibrationHeight;
    for (var i in this.headers){ // hide all elements
      if (!this.hasFlash8up && !this.headers[i].fontPath7Down){
        continue;
      }
      var selectors = this.headers[i].cssSelectors;
      for (var j = 0; j < selectors.length; j++){
        addStyle(selectors[j],'height:' + this.headers[i].lineHeights[0] + 'px;visibility:hidden');
      }
    }
    addEvent(window,'DOMContentLoaded',function(){flashHeaders.create();});
  };
  
  // add headers
  this.add = function(oArg){

    var o = this.headers[this.headers.length] = new Object;
    o.fontPath = oArg.fontPath;
    o.fontPath7Down = oArg.fontPath7Down ? oArg.fontPath7Down : false;
    o.cssSelectors = oArg.cssSelectors;
    o.size = oArg.size ? oArg.size : '';
    o.align = oArg.align ? oArg.align : 'left';
    o.color = oArg.color ? '0x' + oArg.color : '';
    o.bGColor = oArg.bGColor ? '0x' + oArg.bGColor : '';
    o.hoverColor = oArg.hoverColor ? '0x' + oArg.hoverColor : '';
    o.hoverBGColor = oArg.hoverBGColor ? '0x' + oArg.hoverBGColor : '';
    o.paddingTop = oArg.paddingTop ? oArg.paddingTop : 0;
    o.paddingRight = oArg.paddingRight ? oArg.paddingRight : 0;
    o.paddingBottom = oArg.paddingBottom ? oArg.paddingBottom : 0;
    o.paddingLeft = oArg.paddingLeft ? oArg.paddingLeft : 0;
    o.menuHover = oArg.menuHover;
    o.leading = oArg.leading ? oArg.leading : 0;
    o.letterSpacing = oArg.letterSpacing? oArg.letterSpacing : 0;
    o.capitalize = oArg.capitalize;
    o.thickness = oArg.thickness ? oArg.thickness : '';
    o.sharpness = oArg.sharpness ? oArg.sharpness : '';
    o.gridFitType = oArg.gridFitType ? oArg.gridFitType : '';
    o.underline = oArg.underline ? 1 : 0;
    o.lineHeights = oArg.lineHeights ? oArg.lineHeights : [20];
  };
  
  //add an id
  this.newId = function(){
    this.maxId++;
    return 'flash-header' + this.maxId;
  };
  
  //check for resize (win ie only)
  this.checkResize = function(){
    if (!browser.winIE){
        return;
    }
    if (this.currentCalibrationHeight != getEl(this.calibrationId).offsetHeight){
      location.href = location.href;
    }
  };
  
  this.create = function(){
    //scaling
    var cHS = getEl(this.calibrationId);
    if (cHS){
      this.currentCalibrationHeight = cHS.offsetHeight;
      addEvent(window,'resize',function(){flashHeaders.checkResize();});
    }
    var fontScale = cHS ? cHS.offsetHeight / this.calibrationHeight : 1;
    //fontScale = 1;
    // create the flash headers
    
    for (var i in this.headers){

      var o = this.headers[i];
      if (!this.hasFlash8up && !this.headers[i].fontPath7Down){
        continue;
      }
      
      //concat all csselectors, FIXME: older browsers
      var list = [];
      for (var j = 0; j < o.cssSelectors.length; j++){ 
        list = list.concat(getElementsByCSSSelector(o.cssSelectors[j]));
      }
      
      var htmlLineHeights = [];
      for (var j = 0; j < list.length; j++){
        var el = list[j];
        
        if (el.getAttribute('flashSet')){
          continue;
        }
        el.setAttribute('flashSet',true);
        
        el.style.visibility = 'visible';
        var text = o.capitalize ? el.innerHTML.toUpperCase() : el.innerHTML;
        
        //firefox whitespace fixes
        text = text.replace(/^\n+/, '');
        text = text.replace(/\s+/g, ' '); 
        
        text = this.URLEncode(text);
        
        var hLinkEl = el.getElementsByTagName('A')[0];
        hLink = hLinkEl ? this.URLEncode(hLinkEl.href) : '';
        
        var elInnerHTML = el.innerHTML;
        el.innerHTML = '';
        var oldHeader = document.createElement('DIV');
        el.appendChild(oldHeader);
        if (j == 0){ // check html lineHeights
          for (var k = 0; k < o.lineHeights.length; k++){
            oldHeader.innerHTML += 'line<BR/>';
            htmlLineHeights[oldHeader.offsetHeight] = o.lineHeights[k];
          }
        }
        oldHeader.innerHTML = elInnerHTML;
        var h = oldHeader.offsetHeight;
        var height = htmlLineHeights[h] && fontScale == 1 ? htmlLineHeights[h] : o.lineHeights[0];
        //alert(htmlLineHeights[h]);
        var width = oldHeader.offsetWidth;
        oldHeader.className = 'print-header';
        
        var fontPath = this.hasFlash8up ? o.fontPath : o.fontPath7Down;
  
        var swfURL = this.path + this.HGNAME + 
          '?swfFont=' + this.path + fontPath + 
          '&hText=' + text + 
          '&hSize=' + parseInt(o.size * fontScale,10)  + 
          '&hWidth=' + width + 
          '&hAlign=' + o.align +    
          '&hLink=' + hLink +     
          '&hPaddingTop=' + o.paddingTop + 
          '&hPaddingRight=' + o.paddingRight + 
          '&hPaddingBottom=' + o.paddingBottom + 
          '&hPaddingLeft=' + o.paddingLeft +
          '&hLeading=' + o.leading + 
          '&hLetterSpacing=' + o.letterSpacing +  
          '&hThickness=' + o.thickness +  
          '&hSharpness=' + o.sharpness + 
          '&hGridFitType=' + o.gridFitType + 
          '&hUnderline='+ o.underline + 
          '&winIE=' + browser.winIE ;
  
        var colorSet = 
          '&hColor=' + o.color + 
          '&hBGColor=' + o.bGColor;
          
        if (!o.menuHover){
          colorSet += 
          '&hHoverColor=' + o.hoverColor + 
          '&hHoverBGColor=' + o.hoverBGColor;
        }
          
        var params = {'scale':'noscale','salign':'lt','wmode':'transparent','allowScriptAccess':'always'};
        id = this.newId();
        var wTN = hLinkEl ? 'A' : 'DIV'; // wrapperTagName
        //alert(wTN);
        var wrapper = document.createElement(wTN);
        var parentId = id + '-wrapper';
        wrapper.setAttribute('id',parentId);
        if (hLinkEl){
          wrapper.href = hLinkEl.href;
        }
        el.appendChild(wrapper);
        el.style.height = height + 'px';
        this.createFlashObject(o,'flash-header',hLinkEl,id,parentId,swfURL + colorSet,params,width,height);
        
        if (o.menuHover){
          colorSet = 
          '&hColor=' + o.hoverColor + 
          '&hBGColor=' + o.hoverBGColor +         
          '&hHoverColor=' + o.hoverColor + 
          '&hHoverBGColor=' + o.hoverBGColor;
          this.createFlashObject(o,'flash-header-hover',hLinkEl,id + '-MH',parentId,swfURL + colorSet,params,width,height);
        }
      }
    }
    if (browser.winIE) {//active X check flash (to prevent crash)
      var el = document.createElement('div');
      el.setAttribute('id','activeXCheck-container');
      el.style.position = 'absolute';
      el.style.top = '-999em';
      el.style.background = 'F000FF';
      document.body.appendChild(el);
      var elObject = new FlashObject({
        id:'activeXCheck',
        parentId:'activeXCheck-container',
        uri:this.path + this.ACTIVEXTESTNAME,
        requiredVersion:6,
        noFocus:true
      });
      elObject.create();
    }
    //status = (timer.since());
  };

  this.createFlashObject = function(o,className,hLinkEl,id,parentId,swfURL,params,width,height){
  
    this.replacements[id] = o;
    var fO = new FlashObject({
      id:id,
      parentId:parentId,
      uri:(swfURL + '&hId=' + id),
      params:params,
      requiredVersion:6,
      className:className,
      width:width,
      height:height,
      noFocus:true,
      alternateContent:false
    });
    fO.create();
  };

  // win ie getHeights
  this.getHeights = function(){
    for (var i in this.replacements){
      this.getHeight(i,0);
    }
  };
  
  // win ie try to get variables from flash
  this.getHeight = function(i,numTrys){
    var h = getEl(i);
    if (h){
      try {
        this.setHeight(i,h.GetVariable('headerHeight'));
      } 
      catch (e) {
        numTrys++;
        if (numTrys < 4){
          setTimeout('flashHeaders.getHeight(\''+i+'\',' + numTrys + ')',200);
        }
      }
    }
  };

  this.setHeight = function(_id,_height,setFromFlash){
    var o = this.replacements[_id];
    var el = getEl(_id);
    //alert(_id + '--' + _height);
    el.style.height = _height +'px';
    el.parentNode.parentNode.style.height = 'auto';
  };
  
  this.URLEncode = function(inp){
    // The Javascript escape and unescape functions do not correspond
    // with what browsers actually do...
    var SAFECHARS = "0123456789" +          // Numeric
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +  // Alphabetic
            "abcdefghijklmnopqrstuvwxyz" +   //"éëèêáäãâöõóôüúùûïíìîÉËÈÊÁÄÃÂÖÕÓÔÜÚÙÛÏÍÌÎ" +
            "-_.!~*'()";          // RFC2396 Mark characters
    var HEX = "0123456789ABCDEF";
    var SAFECHARCODES = "|233|235|232|234|225|228|227|226|246|245|243|244|252|250|249|251|239|237|236|238|201|203|200|202|193|196|195|194|214|213|211|212|220|218|217|219|207|205|204|206|8212|8216|8217|8220|8221|8211|";
    var plaintext = inp;
    var encoded = "";
    for (var i = 0; i < plaintext.length; i++ ) {
      var ch = plaintext.charAt(i);
      if (ch == " ") {
        encoded += "+";        // x-www-urlencoded, rather than %20
      }
      else if (SAFECHARS.indexOf(ch) != -1) {
        encoded += ch;
      }
      else {
        var charCode = ch.charCodeAt(0);
	      //alert(ch + '**' + charCode );
        if (SAFECHARCODES.indexOf('|'+charCode+'|') != -1){
          encoded += ch;
        }
        else if (charCode > 255) {
          encoded += "+";
        }
        else {
          //alert(ch + '**' + charCode);
          encoded += "%";
          encoded += HEX.charAt((charCode >> 4) & 0xF);
          encoded += HEX.charAt(charCode & 0xF);
        }
      }
    }
    return encoded;
  };
  
}

//create the instance
var flashHeaders = new FlashHeaders();


/************* end flash header *****************/
