(function(window){
  window.KPIBox=window.KPIBox||{};
  var KPIBox = window.KPIBox;

  /*
   * Opens the KPIBox.
   */
  KPIBox.open = function(host_id, opts, callback) {
    if (_overlay !== undefined) {
      showIframe();
      return;
    }
    if (isFunction(opts)) {
      callback = opts;
      opts = {};
    }
    opts = opts || {};
    KPIBox.importer = callback;
    KPIBox.closeHandler = opts.close;
    KPIBox.registeredHandler = opts.registered;
    KPIBox.container = (isString(opts.element) ? document.getElementById(opts.element) : opts.element) || document.body;

    var url, callback_proxy_url = opts.callback_proxy_url;

    if (!callback_proxy_url) {
      callback_proxy_url = window.location.toString();
      callback_proxy_url = callback_proxy_url.substr(0, callback_proxy_url.indexOf("/", 9));
      callback_proxy_url = callback_proxy_url + "/kpibox_proxy.html";
    }

    url = opts['kpilibrary_domain'];
    if (url) {
      if (url.match(/\.local(\:\d+)?$/)) {
        url = "http://kpibox." + url;
      } else {
        url = "https://kpibox." + url;
      }
    } else {
      url = "https://kpibox.kpilibrary.com";
    }
    KPIBox.kpilibrary_endpoint = url;
    url = url + '/kpibox/connect/' + host_id + '?kpibox_proxy=' + encodeURIComponent(callback_proxy_url);
    if (opts.css_url) { url = url + "&css_url=" + encodeURIComponent(opts.css_url); }
    if (opts.label_import) { url = url + "&label_import=" + encodeURIComponent(opts.label_import); }
    if (opts.label_import_all) { url = url + "&label_import_all=" + encodeURIComponent(opts.label_import_all); }
    if (opts.import_format) { url = url + "&import_format=" + encodeURIComponent(opts.import_format); }
    if (opts.import_one) { url = url + "&import_one=1"; }
    if (opts.access_token) { url = url + "&access_token=" + encodeURIComponent(opts.access_token); }
    if (opts.user) {
      if (opts.user.email) { url = url + "&user[email]=" + encodeURIComponent(opts.user.email); }
      if (opts.user.full_name) { url = url + "&user[full_name]=" + encodeURIComponent(opts.user.full_name); }
      if (opts.user.organization) { url = url + "&user[organization]=" + encodeURIComponent(opts.user.organization); }
    }
    KPIBox.kpilibrary_start_url = url;

    KPIBox.close_on_import = opts.close_on_import;

    loadIframe(url);
  };

  /*
   * Closes the KPIBox.
   */
  KPIBox.close = function(event) {
    try {
      _overlay.style.display = 'none';
      if (KPIBox.closeHandler) { KPIBox.closeHandler(event); }
    } catch(e) {}
    return false;
  };

  /*
   * Results are send back to the top frame through the kpibox proxy, which calls this function.
   */
  KPIBox.callback = function(href) {
    var cmd, path, access_token;
    var pairs = href.split("?")[1].replace(/&amp;/g, "&").split("&");
    for (var i = 0; i < pairs.length; i++) {
      if (pairs[i].indexOf("cmd=") == 0) {
        cmd = pairs[i].replace("cmd=", "");
      } else if (pairs[i].indexOf("path=") == 0) {
        path = pairs[i].replace("path=", "");
      } else if (pairs[i].indexOf("access_token=") == 0) {
        access_token = pairs[i].replace("access_token=", "");
      }
    }
    try {
      switch(cmd) {
        case "close" : KPIBox.close(); break;
        case "select" : loadKpi(access_token, path, KPIBox.importer); break;
        case "registered" : if (KPIBox.registeredHandler) { KPIBox.registeredHandler(access_token); } break;
      }
    } catch(e) {}
    return false;
  };

  // protected

  KPIBox._callbacks = {};

  // private functions

  var document = window.document;
  var undefined;
  var _overlay, _iframe, _kpibox_screen, _kpibox_main;

  function loadKpi(access_token, path, importer) {
    if (importer === undefined) { return; }
    var url = KPIBox.kpilibrary_endpoint +
              path +
              (path.indexOf('?') === -1 ? '?' : '&') +
              "format=json";
    jsonp('get', url, importer);
    if (KPIBox.close_on_import) {
      KPIBox.close({imported:true});
    }
  }

  function isFunction(fn) {
    Object.prototype.toString.call(fn) === '[object Function]';
  }

  function isString(obj) {
    return !!(obj === '' || (obj && obj.charCodeAt && obj.substr));
  }

  function jsonp(method, url, cb) {
    var g = guid();
    var script = document.createElement('script');

    if (method !== 'get') {
      url = url + "&_method=" + method;
    }

    jsonpcb = 'window.KPIBox._callbacks.' + g;
    url = url + "&callback=" + jsonpcb;

    if (url.length > 2000) {
      throw new Error('JSONP only support a maximum of 2000 bytes of input.');
    }

    KPIBox._callbacks[g] = function(response) {
      try {
        var redirection_url = response['redirect'];
        if (redirection_url !== undefined) {
          _iframe.src = KPIBox.kpilibrary_start_url + "&x=" + (""+Math.random()).replace(/\D/g, "");
        } else {
          cb && cb(response);
        }
      } catch(e) {}
      delete KPIBox._callbacks[g];
      script.parentNode.removeChild(script);
    };

    script.src = url;
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(script);
  }

  function guid() {
    return 'k' + (Math.random() * (1<<30)).toString(16).replace('.', '');
  }

  function loadIframe(url) {
    try {
      if (_iframe !== undefined) { return; }
      _overlay = document.createElement('div');
      _overlay.id = 'kpibox_overlay';
      _overlay.style.display = 'none';
      _overlay.style.padding = '0px';
      _overlay.style.margin = '0px';
      _overlay.style.position = 'absolute';
      _overlay.style.top = '0';
      _overlay.style.left = '0';
      _overlay.style.right = '0';
      _overlay.style.bottom = '0';
      _overlay.style.zIndex = 99000;
      _overlay.innerHTML = boxContent();
      KPIBox.container.appendChild(_overlay);
      _iframe = document.getElementById('kpibox_iframe');
      if (_iframe.attachEvent) {
        _iframe.attachEvent("onload", iframeLoaded);
      } else if (_iframe.addEventListener) {
        _iframe.addEventListener("load", iframeLoaded, false);
      }
      _iframe.src = url;
      showIframe();
    } catch(e) {}
  }

  function showIframe() {
    _kpibox_screen = document.getElementById('kpibox_screen');
    _kpibox_main = document.getElementById('kpibox_main');
    _overlay.style.height = _kpibox_screen.style.height = getDocHeight() + 'px';
    _kpibox_main.style.top = (getScrollOffsets().top + 25) + 'px';
    _overlay.style.display = 'block';
  }

  function getDocHeight() {
    return Math.max(
      Math.max(document.body.scrollHeight, document.documentElement.scrollHeight),
      Math.max(document.body.offsetHeight, document.documentElement.offsetHeight),
      Math.max(document.body.clientHeight, document.documentElement.clientHeight));
  }

  function getScrollOffsets() {
    var result = {};
    result.left = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
    result.top = window.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop;
    return result;
  }

  function iframeLoaded() {
    document.getElementById('kpibox_init').style.display = "none";
    _iframe.style.display = "block";
    document.getElementById('kpibox_close').style.top = "9px";
  }

  function boxContent() {
    var userAgent = navigator.userAgent.toLowerCase(),
        msie = (/msie/.test(userAgent)) && !(/opera/.test(userAgent)),
        version = (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
        ie7 = (msie && version <= 7),
        closeTopPosition = ie7 ? "9px" : "-15px";
    return '<div id="kpibox_main" style="margin:0 auto; width:700px; height:715px; z-index:2; position:relative;">' +
             '<div id="kpibox_init" style="background-color:#f7f8f9;padding:10px 18px;border: 1px solid #888;margin:24px;-moz-box-shadow:0 0 21px rgba(16, 16, 16, 0.7);-webkit-box-shadow:0 0 21px rgba16, 16, 16, 0.7);box-shadow:0 0 21px rgba(16, 16, 16, 0.7);"><div id="kpibox_view" style="background:#fff;border:3px solid #ddd;-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;padding:18px;"><div style="background:transparent url(' + KPIBox.kpilibrary_endpoint + '/images/ajax-loader.gif) no-repeat;width: 32px;height:32px;font-size:22px;line-height:32px;text-indent:44px;">Loading&hellip;</div></div><div style="color:#aaa;font-size:12px;margin:3px 9px 0 0;text-align:right;"><a href="http://kpilibrary.com?utm_source=kpibox" target="_blank" style="color:#aaa;text-decoration:underline;">Performance Management Software</a> by KPI Library</div></div>' +
             '<iframe id="kpibox_iframe" frameborder="0" scrolling="auto" allowtransparency="true" style="border:0; width:100%; height:100%; display:none;"></iframe>' +
             '<div id="kpibox_close" style="z-index:10000; background:transparent url(' + KPIBox.kpilibrary_endpoint + '/images/kpibox/close.png) no-repeat; position:absolute; top:' + closeTopPosition + '; left:9px; width:30px; height:30px; cursor:pointer;" onclick="javascript:return KPIBox.close(this);"></div>' +
           '</div>' +
           '<div id="kpibox_screen" onclick="return KPIBox.close();" style="position:absolute;top:0;left:0;width:100%;z-index:1;background-color:' + (ie7 ? 'transparent' : '#000') + ';zoom:1;opacity:0.42;filter:alpha(opacity=42);"></div>';
  }

})(this.window || this);


