/*
  ViewsHandler by Christian Heilmann
  Version: 1.0
  Homepage: http://icant.co.uk/sandbox/viewshandler/
  Copyright (c) 2008, Christian Heilmann
  Code licensed under the BSD License:
  http://wait-till-i.com/license.txt
*/
viewsHandler = function(){
  var CSS = {
    classes:{
      hideClass:'hiddenview'
    }
  };
  var labels = {
    switchto:'Switch to '
  };
  function createViews(canvas,views){
    this.views = views;
    if(typeof canvas === 'string'){
      var canvas = document.getElementById(canvas);
    }
    for(var i in views){
      var div = document.createElement('div');
      div.className = CSS.classes.hideClass;
      views[i].container = div;
      canvas.appendChild(div);
      if(views[i].create){
        views[i].create();
      }
    }
    views.canvas = canvas;
  };
  function changeView(view){
    var views = this.views;
    if(views.current){
      views[views.current].container.className = CSS.classes.hideClass;
    }
    views[view].container.className = '';
    views.current = view;
  };
  function defineLabel(view,field,item){
    var views = this.views;
    if(views[view]){
      views[view][field] = item;
    }
  };
  function appendToContainer(view,item){
    if(typeof item === 'string'){
      var item = document.createTextNode(item);
    }
    var views = this.views;
    if(views[view]){
      views[view].container.appendChild(item);
    }
  };
  function createSwitchLink(viewTo,label){
    var a = document.createElement('a');
    a.href = labels.switchto + viewTo;
    a.appendChild(document.createTextNode(label));
    a.onclick = function(){
      viewsHandler.view(viewTo);
      return false;
    };
    return a;
  };
  function getValue(view,field){
    var out = false;
    var views = this.views;
    if(views[view] && views[view][field]){
      var field = views[view][field];
      var out = (field.firstChild.nodeType === 3)
                ? field.firstChild.nodeValue
                : field;
    }
    return out;
  };
  function setValue(view,field,value){
    var views = this.views;
    if(views[view] && views[view][field]){
      var field = views[view][field];
      if(typeof value === 'string' || typeof value === 'number'){
        var value = document.createTextNode(value);
      }
      if(field.hasChildNodes()){
        field.replaceChild(value,field.firstChild);
      } else {
        field.appendChild(value);
      }
    }
  };
  return{
    create:createViews,
    add:appendToContainer,
    define:defineLabel,
    view:changeView,
    linkto:createSwitchLink,
    set:setValue,
    get:getValue
  };
}();
