var version = '1.0';
var initialized = false;
var W3CDOM = (document.createElement && document.getElementsByTagName);

//

function replaceHtml(el, html)
{
  /*@cc_on
  el.innerHTML = html;
  return el;
  @*/

  var nel = el.cloneNode(false);
  nel.innerHTML = html;
  el.parentNode.replaceChild(nel, el);
  return nel;
}

var AjaxRequest = function()
{
  function handleReadyState(o, callback, parent)
  {
    if (o && o.readyState == 4 && o.status == 200)
    {
      if (callback) callback(o, parent);
    }
  }

  var getXHR = function()
  {
    var http;
    try
    {
      http = new XMLHttpRequest;
      getXHR = function() { return new XMLHttpRequest; };
    }
    catch(e)
    {
      var msxml = ['Microsoft.XMLHTTP', 'MSXML2.XMLHTTP', 'MSXML2.XMLHTTP.3.0'];
      var i = msxml.length-1;
      do
      {
        try
        {
          http = new ActiveXObject(msxml[i]);
          getXHR = function()
          {
            return new ActiveXObject(msxml[i]);
          };
          break;
        }
        catch(e) {}
      } while (i--)
    }
    return http;
  };

  return function(method, uri, callback, postData, parent, contentType)
  {
    //debuglib.debug(uri, '#00f');
    postData = (postData) ? postData : '';
    var http = getXHR();
    if (http.overrideMimeType)
      http.overrideMimeType('text/xml');
    http.open(method, uri, true);
    http.setRequestHeader("Content-Type", contentType || "application/xml");
    http.setRequestHeader("Content-Length", postData.length);
    http.onreadystatechange = function(){handleReadyState(http, callback, parent)};
    http.send(postData);
    return http;
  };
}();

var serialize = function()
{
  var myserialize = function(node)
  {
    if (!node) return {};

    var ob = {};
    var i = node.childNodes.length-1;
    do
    {
      try
      {
        ob[node.childNodes[i].nodeName] = (node.childNodes[i].firstChild) ? node.childNodes[i].firstChild.nodeValue : '';
      }
      catch(e)
      {}
    } while (i--);

    return ob;
  };

  return function(node)
  {
    return myserialize(node);
  };
}();

function checkEmail(v)
{
  if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/.test(v)) return true;
  return false;
}

//

var debuglib = {
  version: '2.0',

 _clearvalue: 0,
 _debugger: true,
 _debugw: null,
 _debugh: null,
 _dbuffer: '',

  toggleDebugger:
  function()
  {
    this._debugger = !this._debugger;
    return;
    var el = document.getElementById('debug');
    if (el)
    {
      el.parentNode.style.display = this._debugger ? 'block' : 'none';
    }
  },

  toggleDebugWindow:
  function(el)
  {
    var dw = document.getElementById('debug');
    var db = document.getElementById('debug_buttons');

    if (dw)
    {
      if (this._debugw == null)
      {
        this._debugw = dw.offsetWidth;
        this._debugh = dw.offsetHeight;
        this.debug(this._debugw + ", " + this._debugh);
      }
    }

    if (dw.style.display == 'none')
    {
      if (dw)
      {
        dw.parentNode.style.width = this._debugw + 'px';
        dw.parentNode.style.height = this._debugh + 'px';
        dw.style.display = 'block';
        el.innerHTML = '&#x21e7;';
      }

      if (db) db.style.display = 'block';
    }
    else
    {
      if (dw && dw.parentNode)
      {
        dw.parentNode.style.width = '16px';
        dw.parentNode.style.height = '16px';
        dw.style.display = 'none';
        el.innerHTML = '&#x21e9;';
      }

      if (db) db.style.display = 'none';
    }
  },

  debug:
  function(txt, color)
  {
    if (!this._debugger) return;

    var hide = {};
    if ((hide[color]) && txt != null) return

    if (txt == 0) txt = '<hr size="1" />';

    var el = document.getElementById('debug');
    if (!el)
    {
      txt = color != null ? '<span style="color: ' + color + '">' + txt + '</span>' : txt;
      this._dbuffer += txt + '<br />';
      return;
    }

    if (this._dbuffer != '')
    {
      txt = this._dbuffer + txt;
      this._dbuffer = '';
    }

    if (txt == null)
      replaceHtml(el, 'Version: ' + version + '<br /><br />');
    else
    {
      txt = color != null ? '<span style="color: ' + color + '">' + txt + '</span>' : txt;
      replaceHtml(el, el.innerHTML += txt + '<br />');
    }
  }
};

//

function ImageGallery()
{
  this.images = [];
  this.timer = null;
  this.autoplay = false;
  this.index = 0;
  this.buffer = 0;
  this.prepared = false;
  this.visibility = [100, 100];
  this.direction = 1;
  this.navigation = 2;

  this.Prepare = function(xml)
  {
    var images = xml.getElementsByTagName('image');
    if (images.length == 0) return;

    for (var i=0; i < images.length; i++)
    {
      var XImg = images[i];
      var img = new Image()
      img.src = XImg.getAttribute('url');
      this.images.push(img);
    }

    var el = document.getElementById('ImageGallery.Images');
    if (el && !this.prepared)
    {
      var html = '<div class="image"><img src="' + this.images[this.index].src + '" id="ImageGallery.Image0" alt="" /></div>';
      if (this.images.length > 1)
      {
        html += '<div class="image" style="z-index: 5;"><img src="' + this.images[this.index + 1].src + '" id="ImageGallery.Image1" alt="" /></div>';
        this.index++;
        if (this.index > this.images.length) this.index = 0;
        if (!this.autoplay) this.index--;
      }

      el.innerHTML = html;
      this.prepared = true;
    }

    // prepare navigation
    if (this.navigation != 0 && this.images.length > 1)
    {
      var el = document.getElementById('ImageGallery.Navigation');
      if (el)
      {
        html = '';

        if (this.navigation == 1)
        {
          // thumbnails
          for (var i=0; i < this.images.length; i++)
          {
            var classname = 'thumbnail';
            if (this.index == i) classname = 'thumbnail active';
            html += '<div id="ImageGallery.Thumbnail' + i + '" class="' + classname + '" onclick="Gallery.ShowImage(' + i + ');"><img src="' + this.images[i].src.replace('size=original', 'size=icon') + '" alt="" /></div>'
          }
        }
        else if (this.navigation == 2)
        {
          // arrows
          html += '<div class="thumbnail arrow" onclick="Gallery.PrevImage();"><img src="/images/layout/arrow_left.png" alt="Forrige" /></div><div class="thumbnail arrow" onclick="Gallery.NextImage();"><img src="/images/layout/arrow_right.png" alt="Neste" /></div>'
        }
        el.innerHTML = html;
      }
    }

    if (this.autoplay) this.Play();
  }

  this.Play = function()
  {
    this.timer = setTimeout("Gallery.NextImage()", 3000);
  }

  this.PrevImage = function()
  {
    if (this.visibility[this.buffer] == 100)
    {
      clearTimeout(this.timer);
      var index = this.index - 1;
      if (index < 0) index = this.images.length-1;
      this.ShowImage(index);
    }
  }

  this.NextImage = function()
  {
    if (this.visibility[this.buffer] == 100)
    {
      clearTimeout(this.timer);
      var index = this.index + 1;
      if (index >= this.images.length) index = 0;
      this.ShowImage(index);
    }
  }

  this.ShowImage = function(index)
  {
    if (this.index != index && this.visibility[this.buffer] == 100)
    {
      clearTimeout(this.timer);

      var el = document.getElementById('ImageGallery.Thumbnail' + this.index);
      if (el) el.className = 'thumbnail';

      this.index = index;

      el = document.getElementById('ImageGallery.Thumbnail' + this.index);
      if (el) el.className = 'thumbnail active';

      var buffer = this.buffer + 1;
      if (buffer > 1) buffer = 0;

      el = document.getElementById('ImageGallery.Image' + buffer);
      el.src = this.images[this.index].src;
      el = el.parentNode;
      el.style.zIndex = 4;
      el.style.opacity = 1.0;
      el.style.filter = 'alpha(opacity=100)';
      this.visibility[buffer] = 100;

      this.timer = setInterval("Gallery.FadeImage()", 5);
    }
  }

  this.FadeImage = function()
  {
    if (this.visibility[this.buffer] > 0)
      this.visibility[this.buffer] = this.visibility[this.buffer] - 5;
    else
    {
      clearInterval(this.timer);
      if (this.autoplay)
      {
        this.index += this.direction;
        if (this.index < 0) this.index = this.images.length-1;
        if (this.index >= this.images.length) this.index = 0;

        var el = document.getElementById('ImageGallery.Image' + this.buffer);
        el.src = this.images[this.index].src;
        el = el.parentNode;
        el.style.zIndex = 4;
        el.style.opacity = 1.0;
        el.style.filter = 'alpha(opacity=100)';
        this.visibility[this.buffer] = 100;
      }

      this.buffer++;
      if (this.buffer > 1) this.buffer = 0;

      var el = document.getElementById('ImageGallery.Image' + this.buffer);
      el = el.parentNode;
      el.style.zIndex = 10;

      if (this.autoplay) this.Play();
    }

    var el = document.getElementById('ImageGallery.Image' + this.buffer);
    if (el)
    {
      el = el.parentNode;
      el.style.opacity = parseFloat(this.visibility[this.buffer]) / 100.0;
      el.style.filter = 'alpha(opacity=' + this.visibility[this.buffer] + ')';
    }
  }
}

var Gallery = new ImageGallery();

//

var dc = {
  version: '1.0',
  transition: 0,
  timer: null,
  scroll: {},
  scrollActive: false,
  scrollEl: null,
  scrollTimer: null,
  scrollerwidth: 493,
  itemwidth: 493,
  blockId: 0,

  //

  load_info:
  function(id)
  {
    var box = document.getElementById('popup_box');
    box = replaceHtml(box, '<div class="progress"></div>');
    $("#popup").fadeIn("fast", function(){     AjaxRequest('post', '/scripts/getObjectInfo.xml', dc.handle_load, id, dc);});
  },

  handle_load:
  function(response, ob)
  {
    //debuglib.debug("Information loaded!");
    var xml = response.responseXML;
    var item = xml.getElementsByTagName('item')[0];
    var images = item.getElementsByTagName('image');
    var thumbs = '';
    var html = '';
    var parent = item.getAttribute('parent');
    item = serialize(item);

    if (images.length > 1)
    {
      var il = images.length;
      var ii = il - 1;
      for (var i=0; i < il; i++)
      {
        var cls = '';
        var url = images[i].getAttribute('src');
        if (i == ii) cls = ' class="last"';
        thumbs += '<img' + cls + ' src="' + url + '/?size=tiny" alt="" onclick="dc.swap_image(\'' + url + '\');" /> ';
      }
      thumbs = '<div class="thumbnails">' + thumbs + '</div>';
    }

    if (parent == 'teamet')
    {
      var image = (images.length > 1 ? '<img src="' + images[1].getAttribute('src') + '/?size=large" alt="" />' : '');
      html = '<div class="person"><div class="image" id="level0">' + image + '</div><div class="text"><h1 class="title">' + item.title + '</h1><div class="split"></div>' +
             (item.abstract != '' ? '<h1 class="title">' + item.abstract + '</h1><div class="split"></div>' : '') +
             '<div class="body">' + item.body + '</div></div></div>';
    }
    else
    {
      html = '<div class="project"><div class="image" id="level0"><img src="' + images[0].getAttribute('src') + '/?size=large" alt="" /></div><div class="image" id="level1"></div>' +
             '<div class="text' + (images.length < 2 ? ' noimages' : '') + '"><h1 class="title"><span class="client_title">Kunde:</span> ' + item.title + '</h1><div class="split"></div>' +
             (item.abstract != '' ? '<h1 class="title"><span class="project_title">Oppgave:</span> ' + item.abstract + '</h1><div class="split"></div>' : '') +
             '<div class="body">' + item.body + '</div></div>' + thumbs + '</div>';
    }

    var box = document.getElementById('popup_box');
    box = replaceHtml(box, html);
    box.style.display = 'none';
    $(box).fadeIn("slow");
  },

  swap_image:
  function(url)
  {
    if (dc.transition == 0)
    {
      var el = document.getElementById('level1');
      dc.fimg = el;
      el.innerHTML = '<img src="' + url + '/?size=large" alt="" />';
      dc.timer = setInterval("dc.fade_image()", 5);
    }
  },

  fade_image:
  function()
  {
    if (dc.transition < 100)
      dc.transition = dc.transition + 2;
    else
    {
      clearInterval(dc.timer);
      dc.transition = 0;
      var el = document.getElementById('level0');
      el.innerHTML = dc.fimg.innerHTML;
    }

    if (dc.fimg)
    {
      var el = dc.fimg;
      el.style.opacity = parseFloat(dc.transition) / 100.0;
      el.style.filter = 'alpha(opacity=' + dc.transition + ')';
    }
  },

  scroll_to:
  function(el, pn)
  {
    if (!dc.scrollActive)
    {
      dc.scrollId = el.id.split('_');
      var offset = 1;
      var sld = document.getElementById('sld_' + dc.scrollId[1]);
      if (!sld) return false;

      if (dc.scroll[dc.scrollId[1]] == null)
      {
        var w = 0;
        var r = dc.scrollerwidth;
        //var p = parseInt((sld.offsetWidth / r)) + (sld.offsetWidth % r != 0 ? 1 : 0);
        var nodes = sld.childNodes;
        var i = nodes.length-1;
        do
        {
          if (nodes[i].nodeType == 1) w += dc.itemwidth;
        } while (i--);

        var p = parseInt((w / r)) + (w % r != 0 ? 1 : 0);

        dc.scroll[dc.scrollId[1]] = {'x':0, 'origin':0, '_range':r, 'range':r, '_speed':40, 'speed':40, 'current':0, 'dir':-1, 'page':0, 'pages':p, 'pmoved':-1};
        var rld = document.getElementById('rl_' + dc.scrollId[1]);
        dc.scroll[dc.scrollId[1]]['indicator'] = rld;
      }

      if (dc.scroll[dc.scrollId[1]].pages == 0) return false;

      if (pn)
      {
        offset = Math.abs(dc.scroll[dc.scrollId[1]].page - pn);
        dc.scroll[dc.scrollId[1]].range = dc.scroll[dc.scrollId[1]]._range * offset;
      }

      dc.scroll[dc.scrollId[1]].dir = (dc.scrollId[0] == 'ar' ? -1 : 1);
      dc.scroll[dc.scrollId[1]].pmoved = dc.scroll[dc.scrollId[1]].dir * offset;

      //debuglib.debug("Dir: " + dc.scroll[dc.scrollId[1]].dir + ", Page: " + dc.scroll[dc.scrollId[1]].page);

      //if ((dc.scroll[dc.scrollId[1]].dir == 1 && dc.scroll[dc.scrollId[1]].page == 0) ||
      //    (dc.scroll[dc.scrollId[1]].dir == -1 && dc.scroll[dc.scrollId[1]].page == (dc.scroll[dc.scrollId[1]].pages - 1))) return false;

      if (dc.scroll[dc.scrollId[1]].dir == 1 && dc.scroll[dc.scrollId[1]].page == 0)
      {
        //var dl = document.getElementById('pi_' + dc.scrollId[1] + '_' + (dc.scroll[dc.scrollId[1]].pages - 1));
        dc.goto_page('pi_' + dc.scrollId[1] + '_' + (dc.scroll[dc.scrollId[1]].pages - 1));
        return false;
      }
      else if (dc.scroll[dc.scrollId[1]].dir == -1 && dc.scroll[dc.scrollId[1]].page == (dc.scroll[dc.scrollId[1]].pages - 1))
      {
        //var dl = document.getElementById('pi_' + dc.scrollId[1] + '_0');
        dc.goto_page('pi_' + dc.scrollId[1] + '_0');
        return false;
      }

      dc.scrollEl = sld;
      dc.scrollActive = true;
      clearInterval(dc.timer);
      dc.scrollTimer = setInterval("dc.scroller()", 10);
      //debuglib.debug("SCROLL1: " + dc.scrollId + " Width: " + sld.offsetWidth + " Pages: " + dc.scroll[dc.scrollId[1]].pages, 'red');
    }

    return false;
  },

  scroller:
  function()
  {
    var sc = dc.scroll[dc.scrollId[1]]

    //debuglib.debug("Scroll " + dc.scrollId[1] + ", direction " + dc.scrollId[0], 'green');
    var delta = sc.range - sc.current;
    var dr = 1.0;
    if (delta < 10) dr = 7;
    else if (delta < 25) dr = 5;
    else if (delta < 50) dr = 3;
    else if (delta < 100) dr = 2;

    sc.current = sc.current + (sc.speed / dr);

    //debuglib.debug("D: " + delta + ", " + dr, 'red');
    //sc.speed = sc.speed - 1;
    sc.x = sc.origin + (sc.current * sc.dir);

    if (sc.current >= sc.range)
    {
      clearInterval(dc.scrollTimer);
      sc.current = 0;
      sc.x = sc.origin + (sc.range * sc.dir);
      sc.origin = sc.x;
      sc.page = sc.page - sc.pmoved;
      sc.range = sc._range;
      sc.speed = sc._speed;
      dc.scrollActive = false;
      //debuglib.debug("Done! Now on page " + sc.page, 'red');

      // fix for changing the default zoom image in lightbox
      var zi = $j('img', '#sld_0')[sc.page];
      if (zi)
      {
        var osr = $j('.zoom').attr('href');
        var src = zi.src.split('?')
        var zimg = new Image();
        zimg.src = src[0] + '?size=zoom';
        $j('.zoom').attr('href', src[0] + '?size=zoom');
        if (sc.dir == -1)
        {
          var fi = $j('a:first', '#zimgs');
          var isrc = $j(fi).attr('href');
          $j(fi).remove();
          $j('#zimgs').append('<a href="' + osr + '" rel="lightbox[roadtrip]"></a>') //<a href="' + isrc + '" rel="lightbox[roadtrip]"></a>');
        }
        else
        {
          var fi = $j('a:last', '#zimgs');
          var isrc = $j(fi).attr('href');
          $j(fi).remove();
          $j('#zimgs').prepend('<a href="' + osr + '" rel="lightbox[roadtrip]"></a>');
        }
      }

      // fix indicators
      if (sc.indicator)
      {
        var ll = sc.indicator.getElementsByTagName('span');
        var il = ll.length;
        for (var i=0; i < il; i++)
        {
          ll[i].className = (i == sc.page ? 'round active' : 'round');
        }
      }
    }
    //debuglib.debug("X: " + dc.scroll[dc.scrollId[1]].x);

    dc.scrollEl.style.left = dc.scroll[dc.scrollId[1]].x + 'px';
  },

  goto_page:
  function(pid)
  {
    var pageId = pid.split('_');
    if (dc.scroll[pageId[1]] == null)
    {
      var el = document.getElementById('ar_' + pageId[1]);
      dc.scroll_to(el, pageId[2]);
      return false;
    }

    var sc = dc.scroll[pageId[1]];
    if (sc.page == pageId[2]) return false;

    var el = (sc.page < pageId[2] ? document.getElementById('ar_' + pageId[1]) : document.getElementById('al_' + pageId[1]));
    dc.scroll_to(el, pageId[2]);
  },

  show_block:
  function(el)
  {
    var details = el.getAttribute('id').split('_');
    var blckId = parseInt(details[1]);
    if (blckId != this.blockId)
    {
      var ol = document.getElementById('pjb_' + this.blockId);
      if (ol) $(ol).slideUp("fast"); //ol.style.display = 'none';
      this.blockId = blckId;

      var nl = document.getElementById('pjb_' + blckId);
      if (nl) $(nl).slideDown("fast"); //nl.style.display = 'block';
    }
  },

  hide_popup:
  function()
  {
    $("#popup").fadeOut("slow");
  }
};
