var Forbrukerportalen = {}

Forbrukerportalen.initialize =  function(){
  Forbrukerportalen.viewTermOnMouseOverRegister();    
}

//Plugin for display of terms on mouseover
Forbrukerportalen.viewTermOnMouseOverRegister = function(){
  var terms = Forbrukerportalen.DOM.getElementsByTagAndClassName('a', "term");
  var attachEvent = Forbrukerportalen.Event.attachEventHandler;
  var mouseOutHandler = Forbrukerportalen.TextEnchancement.Term.onMouseOut
  var mouseOverHandler = Forbrukerportalen.TextEnchancement.Term.onMouseOver
  for(var i=0, ilength=terms.length; i<ilength; i++){
    var term = terms[i];    
    attachEvent(term, "onmouseover", mouseOverHandler);
    attachEvent(term, "onmouseout", mouseOutHandler); 
  }
}

/*
Methods for DOM-manipulation / retrieval
*/
Forbrukerportalen.DOM = {}

Forbrukerportalen.DOM.getElementsByTagAndClassName = function (tagName, className) {  
  if (typeof(tagName) == 'undefined' || tagName === null) {
    tagName = '*';
  }
  var elements = [];
  var children = document.getElementsByTagName(tagName)
  for (var i = 0, ilength=children.length; i < ilength; i++) {
    var child = children[i];
    var classNames = child.className.split(' ');
    for (var j = 0; j < classNames.length; j++) {
      if (classNames[j] == className) {
          elements.push(child);
          break;
      }
    }
  }
  return elements;
}

/*
Methods for enhancing user experience while reading text.
*/
Forbrukerportalen.TextEnchancement = {}
Forbrukerportalen.TextEnchancement.Term = {}
Forbrukerportalen.TextEnchancement.Term.TERM_LEFT = 0;
Forbrukerportalen.TextEnchancement.Term.TERM_RIGHT = 1;
Forbrukerportalen.TextEnchancement.Term.termContainers = [];

Forbrukerportalen.TextEnchancement.Term.onMouseOver = function(e){
  var cx = e.clientX;
  var cy = e.clientY;  
  var clientCenter = (document.body.clientWidth / 2)  
  var side = Forbrukerportalen.TextEnchancement.Term.TERM_RIGHT;
  if(cx > clientCenter){
    side = Forbrukerportalen.TextEnchancement.Term.TERM_LEFT;  
  }   
  var src = e.target || e.srcElement;    
  //TODO: check for closure-leaks
  src.style.cursor = "help";  
  //TODO: don't show tip unless we are still hovering over the link after given time
  src.mouseOn = true;
  term = src.getAttribute("title");
  src.term = term;
  src.setAttribute("title", "");    
  setTimeout(function(){Forbrukerportalen.TextEnchancement.Term.displayTerm(src, side)}, 400);    
}

Forbrukerportalen.TextEnchancement.Term.getTermContainer = function(obj, side){ 
  //An mouseout-event has occured, do not show the term.   
  if(!obj.mouseOn){
    return null;
  }
  var parent = obj.parentNode;
  var termContainer = obj.termContainer
  var term = obj.term;
  
  if(typeof side == 'undefined' && termContainer){
    side = termContainer.side;
  }
  if(termContainer){
    //already created
    if(side == termContainer.side){
      return termContainer
    } 
    else{       
      //Display term on other side - remove the current term-container     
      term = termContainer.term;        
      parent.removeChild(termContainer);        
    }  
  }
  termContainer = document.createElement("span");   
  termExplained = document.createElement("div");    
   
  termExplained.innerHTML = term;        
  termContainer.term = term;    
  termContainer.appendChild(termExplained);  
    
  switch(side){
    case Forbrukerportalen.TextEnchancement.Term.TERM_LEFT:
      termContainer.setAttribute("class", "termContainerLeft");
      termContainer.side = Forbrukerportalen.TextEnchancement.Term.TERM_LEFT;
      termContainer.className = "termContainerLeft"; 
      termExplained.setAttribute("class", "termExplainedLeft");
      termExplained.className = "termExplainedLeft";       
      parent.insertBefore(termContainer, obj);  
      break;
    case Forbrukerportalen.TextEnchancement.Term.TERM_RIGHT:   
      termContainer.setAttribute("class", "termContainerRight");
      termContainer.className = "termContainerRight";
      termContainer.side = Forbrukerportalen.TextEnchancement.Term.TERM_RIGHT;
      termExplained.setAttribute("class", "termExplainedRight");
      termExplained.className = "termExplainedRight";
      parent.insertBefore(termContainer, obj.nextSibling);  
      break;
    default:
      return
      break;
  }   
  obj.termContainer = termContainer;
  var termContainers = Forbrukerportalen.TextEnchancement.Term.termContainers;
  //termContainers[termContainers.length] = termContainer;
  return termContainer;
}
Forbrukerportalen.TextEnchancement.Term.onMouseOut = function(e){  
  var src = e.target || e.srcElement;
  src.title = src.term;
  src.mouseOn = false;  
  var termContainer = src.termContainer;
  if(termContainer){   
    termContainer.visible = false;  
    Forbrukerportalen.UI.Effect.Fade(termContainer, 100, 10, 10,-1);              
  }  
}

Forbrukerportalen.TextEnchancement.Term.displayTerm = function(obj, side){  
  
  //check if we are still hoovering over the term.  
  if(!obj.mouseOn){
    return false;
  }
  var termContainer = Forbrukerportalen.TextEnchancement.Term.getTermContainer(obj, side);
  termContainer.visible = true;  
  termContainer.style.visibility = "visible"
  //failsafe - make sure that only one term is visible at a time
  /*
  var termContainers = Forbrukerportalen.TextEnchancement.Term.termContainers;  
  for(var i=0, ilength=termContainers.length; i<ilength; i++){
    var tc = termContainers[i];    
    if(termContainer != tc && tc.visible){
      Forbrukerportalen.UI.Effect.Fade(termContainer, 100, 1, 0, -1);      
    }
  }
  */  
  Forbrukerportalen.UI.Effect.Fade(termContainer, 0, 5, 10, 1);  
}

/*
Event handling
*/
Forbrukerportalen.Event = {}
Forbrukerportalen.Event.attachEventHandler = function(obj, eventType, eventHandler){  
  if(obj.attachEvent){       
    obj.attachEvent(eventType, eventHandler)
  }
  else if(obj.addEventListener){  
    obj.addEventListener(eventType.substr(2), eventHandler, false);      
  }
}
/*
  User interface
*/
Forbrukerportalen.UI = {}
Forbrukerportalen.UI.Effect = {}    
//TODO: do something smarter here - more control over the timing of the effect
Forbrukerportalen.UI.Effect.Fade = function(obj, startOpacity, steps, timeBetweenSteps ,fadeIn, /*don't set at initiation*/inc){      
  if(steps == 0){
    if(fadeIn == -1){      
      obj.style.visibility = "hidden";
    }    
    return
  }    
  if(!inc){ 
    inc = 100/steps;    
  }                  
  var newOpacity = startOpacity + (inc*fadeIn);
  var newOpacityPerc = newOpacity/100;
  obj.style.filter = "alpha(opacity="+newOpacity+")";  
  obj.style.opacity = newOpacityPerc;  
  steps = steps -1;
  
  //TODO: check for closure-leaks
  setTimeout(function(){Forbrukerportalen.UI.Effect.Fade(obj, newOpacity, steps, timeBetweenSteps, fadeIn, inc)}, timeBetweenSteps);   
}

/*
  Simple logging module
*/
var logwriter = null;
Forbrukerportalen.Log = {}
Forbrukerportalen.Log.Write = function(text){
  if(!logwriter){
    logwriter = document.getElementById("log")  
  }
  var logentry = document.createElement("li")
  logentry.appendChild(document.createTextNode(text))
  logwriter.appendChild(logentry);   
}
var log = Forbrukerportalen.Log.Write

/*
  Initialize term-parsing on window.onload
*/
window.onload = Forbrukerportalen.initialize;

