function PieChart () {
  var colors = ["#00a651", "#f66", "#00aeef", "#a67c52", "#ffcc00", "#662d91", "#8dc63f", "#92278f", "#f7941d", "#0054a6", "#ccc"],
     items = [],
    titles = [],
       sum = 0,
    labels = [],
     title = 2, //0 - digits, 1 - percent, 2 - titles
       div = null,
       S = 15;
  this.start = 0; //deg
  this.sum = 0;
  this.onsubmit = function() {
  }
  this.setValues = function(){
    items = [];
    titles = ["inform", "input", "conflict", "trust", "action", "collaboration", "policy", "other"],
    labels = [];
    if (typeof this.setValues.arguments[0] == "object" && this.setValues.arguments[0].length) {
      items = this.setValues.arguments[0];
      if (typeof this.setValues.arguments[1] == "object" && this.setValues.arguments[1].length) {
        titles = this.setValues.arguments[1];
      }
      if (typeof this.setValues.arguments[1] == "string") {
        titles = eval('["' + this.setValues.arguments[1].replace(/,/g, '","') + '"]');
      }
    } else {
      for (var i = 0; i < this.setValues.arguments.length; i++) {
        items[i] = this.setValues.arguments[i]
      }
    }
    if (!titles.length && title > 1) {
      title = 0;
    }
    this.redraw();
  };
  
  
  this.printTo = function(divid){
    div = document.getElementById(divid);
    if (!div) {
      return false;
    }
    build(this.start);
  };
  
  
  this.redraw = function(){
    if (div) {
      var divs = div.getElementsByTagName("div");
      while (divs.length) {
        div.removeChild(divs[0]);
      }
      build(this.start);
    }
  };
  
  
  this.rotate = function(angle) {
    angle = this.start + angle;
    angle = angle % 360;
    if (angle < 0) {
      angle = 360 + angle;
    }
    this.start = angle;
    this.redraw();
  };
  
  
  this.setTitle = function(newtitle){
    if (newtitle > 2) {
      newtitle = 0;
    }
    title = newtitle;
    if (title > 1 && !titles.length) {
      title = 0;
    }
    var pc = sum / 100;
    for (var i = 0, j = items.length; i < j; i++) {
      switch (title) {
        case 0 : labels[i].nodeValue = items[i]; break;
        case 1 : labels[i].nodeValue = Math.round(items[i] / pc * 10) / 10 + "%"; break;
        case 2 : labels[i].nodeValue = titles[i]; break;
      }
    }
  };
  
  
  this.title = function(){
    this.setTitle(title + 1);
  };
  
  
  var build = function(start){
    if (!div) {
      return;
    }
    sum = 0;
    for (var i = 0; i < items.length; i++) {
      sum += items[i];
    }
    var pc = sum / 100;
    var alpha = 2 * Math.PI / sum,
          Q = 1,
          q = 1,
      angle = 0,
      whole = start * Math.PI / 180,
      sigma = 0.01,
          Z = 10;
    for (var i = 0; i < items.length; i++) {
      //labels
      var labeldiv = document.createElement("div");
      var labelspan = document.createElement("span");
      switch (title) {
        case 0 : var labeltext = items[i]; break;
        case 1 : var labeltext = Math.round(items[i] / pc * 10) / 10 + "%"; break;
        case 2 : var labeltext = titles[i]; break;
      }
      if (items[i] == 0) {
       labeltext ='';
      }
      
      labels[i] = document.createTextNode(labeltext);
      labelspan.appendChild(labels[i]);
      labeldiv.appendChild(labelspan);
      labeldiv.className = "pie-label";
      var labelangle = (whole + alpha * items[i] / 2) % (Math.PI * 2);
      // var pos = (labelangle > Math.PI?1:-1) * (S / 3 * 2 * Math.abs(Math.sin(labelangle)));
      var pos = (labelangle > Math.PI?1:-1) * (S / 5 * 3 * Math.abs(Math.sin(labelangle)));
      if (isNaN(pos) || Math.abs(pos) < 0.001) pos = 0;
      labeldiv.style.top = pos + "em";
      // pos = (labelangle < Math.PI / 2 || labelangle > Math.PI / 2 * 3?1:-1) * (S / 3 * 2 * Math.abs(Math.cos(labelangle)));
      pos = (labelangle < Math.PI / 2 || labelangle > Math.PI / 2 * 3?1:-1) * (S / 5 * 3 * Math.abs(Math.cos(labelangle)));
      if (isNaN(pos) || Math.abs(pos) < 0.001) pos = 0;
      labeldiv.style.left = pos + "em";
      div.appendChild(labeldiv);
      if (items[i] == 0) {
        labeldiv.style.display = "none";
      }

      var sector = document.createElement("div");
      whole += alpha * items[i];
      angle = whole - Math.PI / 2 * (Q - 1);
      while (angle > Math.PI / 2 + sigma) {
        var bg = document.createElement("div");
        bg.className = "bg sector-" + q;
        bg.style.backgroundColor = colors[i % colors.length];
        bg.style.zIndex = Z--;
        div.appendChild(bg);
        Q++;
        Z = 10 * Q;
        if (Q > 4) {
          q = Q - 4;
        } else {
          q = Q;
        }
        angle = whole - Math.PI / 2 * (Q - 1);
      }
      if (Math.abs(Math.PI / 2 - angle) <= sigma) { //almost 90 deg
        var bg = document.createElement("div");
        bg.className = "bg sector-" + q;
        bg.style.backgroundColor = colors[i % colors.length];
        bg.style.zIndex = Z--;
        div.appendChild(bg);
        Q++;
        Z = 10 * Q;
        if (Q > 4) {
          q = Q - 4;
        } else {
          q = Q;
        }
      } else {
        sector.className = "pie sector-" + q;
        var size = Math.abs(S * Math.tan(angle));
        var size2 = S;
        if (size > 0) {
          if (size > S) {
            size2 = S * Math.cos(angle) / Math.sin(angle);
            size = S;
            sector.style[[0, "width", "height", "width", "height"][q]] = S - size2 + "em";
          }
          sector.style["border" + [0, "Left", "Bottom", "Right", "Top"][q]] = "solid " + size2 + "em transparent";
          sector.style["border" + [0, "Bottom", "Right", "Top", "Left"][q]] = "solid " + size + "em " + colors[i % colors.length];
          sector.size = size;
          sector.colour = colors[i % colors.length];
          sector.style.zIndex = Z--;
          div.appendChild(sector);
        }
      }
    }
  };
}
