
DLX = function() {

  var $D = YAHOO.util.Dom;
  var $E = YAHOO.util.Event;
  var $A = YAHOO.util.Anim;
  var $M = YAHOO.util.Motion;
  var $ = $D.get;

  var swf = swfobject;
  var dialog = null;
  var gMap = null;
  var fader = null;
  var player = null;

  /**
  * Movie player controller
  */
  Player = function(el) {

    /**
    * The DOM element container (#splash on the home page)
    */
    this.el = {};

    /**
    * The <a> els that append <object> or <embed> when the player loads
    */
    this.movies = [];

    /**
    * The <img> els that the <object>/<embed> replaces
    */
    this.images = [];

    /**
    * The ID of the current active record
    */
    this.current = 0;

    /**
    * The Flowplayer instance
    */
    this.player = {};

    /**
    * Flowplayer Flash config variables
    */
    this.flash = {
      height: 517,
      src: '/assets/swf/flowplayer-3.1.2.swf',
      width: 960
    };

    /**
    * Flowplayer JS config variables
    */
    this.config = {
      canvas: { 
        backgroundColor: "#e31e1e",
        backgroundGradient: 'none',
        backgroundColor: "#000"
      },
      playlist: [],
      clip: { 
        scaling: 'orig',
        onStart: function (clip) { }
      },
      plugins: {
        controls: {
          url: '/assets/swf/flowplayer.controls-3.1.2.swf',
          sliderGradient: 'none',
          progressColor: '#e31e1e',
          tooltipTextColor: '#D00000',
          volumeSliderGradient: 'none',
          durationColor: '#ffffff',
          buttonColor: '#000000',
          tooltipColor: '#C9C9C9',
          bufferColor: '#C78F8E',
          borderRadius: '0',
          progressGradient: 'none',
          timeColor: '#ffffff',
          backgroundGradient: 'none',
          timeBgColor: '#555555',
          sliderColor: '#555555',
          bufferGradient: 'none',
          backgroundColor: '#ffffff',
          buttonOverColor: '#e31e1e',
          volumeSliderColor: '#D00000',
          height: 24,
          opacity: 1.0
        }
      }
    };

    if (el) {
      this.init(el);
    }

  };

  Player.prototype = {

    /**
    * Show the previous/next/close controls and play the active movie
    */
    open: function() {

      var lis = $('gallery').getElementsByTagName('li');
      $D.setStyle('controls', 'display', 'block');
      clearInterval(fader);

      var h = parseInt($D.getStyle(this.el, 'height').slice(0, -2), 10);
      var attributes = {
        height: { 
          from: h, 
          to: h+40 }
      };
      $D.addClass(this.el, 'active');
      var anim = new YAHOO.util.Motion(this.el, attributes, .3, YAHOO.util.Easing.easeIn);
      anim.onComplete.subscribe(function() {
        var pos = 0;
        for (var i = pos; i < lis.length; i++) {
          if($D.getStyle(lis[i], 'opacity') == 1) {
            pos = i;
            break;
          }
        }
        return this.player.play(pos);
      }, this, true);
      anim.animate();

    },

    /**
    * Close the previous/next/close controls and show the splash image
    */
    close: function() {

      $D.removeClass(this.el, 'active');

      this.player.unload();

      var objs = this.el.getElementsByTagName('object');
      for (var i = 0; i < objs.length; i++) {
        objs[i].parentNode.removeChild(objs[i]);
      }

      var embeds = this.el.getElementsByTagName('embed');
      for (var i = 0; i < embeds.length; i++) {
        embeds[i].parentNode.removeChild(objs[i]);
      }

      $('movies').appendChild(this.clone);

      var h = parseInt($D.getStyle(this.el, 'height').slice(0, -2), 10);
      var attributes = {
        height: { 
          from: h, 
          to: h-40 }
      };
      var anim = new YAHOO.util.Motion(this.el, attributes, .3, YAHOO.util.Easing.easeIn);
      anim.onComplete.subscribe(function() {
        $D.setStyle('controls', 'display', 'none');
        fader = setInterval(DLX.imageFader, 5000);
      }, this, true);
      anim.animate();

    },

    /**
    * Move to the next movie
    */
    next: function(e) {
      if(this.movies[this.current+1]) {
        this.player.stop();
        this.current = this.current+1;
        this.player.play(this.current);
      }
    },

    /**
    * Set the id based on the passed URL
    */
    setCurrent: function(url) {
      for (var i = 0; i < this.movies.length; i++) {
        if(this.movies[i] == url) {
          this.current = i;
          break;
        }
      }
    },

    /**
    * Move to the previous movie
    */
    previous: function(e) {
      if(this.movies[this.current-1]) {
        this.player.stop();
        this.current = this.current-1;
        this.player.play(this.current);
      }
    },

    /**
    * Initialize and setup event handlers
    * @param  DOMDocument  The DOM node to attach events to
    */
    init: function(el) {

      this.el = el;
      this.clone = $D.getFirstChild('movies').cloneNode(true);

      var movies = this.el.getElementsByTagName('a');
      for (var i = 0; i < movies.length; i++) {
        this.movies.push(movies[i].href);
        this.config.playlist.push({url: movies[i].href});
        this.config.playlist[i].onBegin = function() {
          var u = this.getClip().url;
          DLX.player.setCurrent(u);
        };
        if(i == 2) {
          this.config.playlist[i].width = 300;
        }
      }

      $E.on(this.el.getElementsByTagName('a'), 'click', this.open, this, true);
      $E.on('close', 'click', this.close, this, true);
      $E.on('next', 'click', this.next, this, true);
      $E.on('previous', 'click', this.previous, this, true);

      this.player = flowplayer($('movies'), this.flash, this.config);

    } // end Player.init()

  }; 

  var addToMap = function(el) {

    var geocoder = new GClientGeocoder();

    var address = el.getElementsByTagName('address')[0].getElementsByTagName('span');
    var str_address = '';
    var title = '<div class="map-dialog">'+el.innerHTML+'</div>';

    for(var i = 1; i < address.length; i++) {
      if($D.hasClass(address[i], 'lat')) {
        var lat = address[i].innerHTML;
      } else if($D.hasClass(address[i], 'lon')) {
        var lon = address[i].innerHTML;
      } else {
        str_address += address[i].innerHTML+' ';
      }
    }

    if(lat != '0.0000000000' && lon != '0.0000000000') {
      var point = new GLatLng(lat, lon);
      DLX.gMap.setCenter(point, 13);
      var marker = new GMarker(point);
      DLX.gMap.addOverlay(marker);
      marker.openInfoWindowHtml(title);
    } else {
      geocoder.getLatLng(
        str_address,
        function(point) {
          if (!point) {
            alert('Sorry, "'+str_address+'" was not found in Google Maps.');
          } else {
            DLX.gMap.setCenter(point, 13);
            var marker = new GMarker(point);
            GEvent.addListener(marker, "click", function() {
              marker.openInfoWindowHtml(title);
            });
            DLX.gMap.addOverlay(marker);
            marker.openInfoWindowHtml(title);
          }
        }
      );
    }
  };

  return {
    swf: swf,
    dialog: dialog,
    gMap: gMap,
    player: player,

    imageFader: function() {

      var images = $('gallery').getElementsByTagName('li');
      var cur = 0;
      var next = 0;

      for(var i = 0; i < images.length; i++) {
        if($D.getStyle(images[i], 'opacity') > 0) {
          cur = i;
        } else {
          $D.setStyle(images[i], 'opacity', 0);
        }
      }

      if(cur != images.length - 1) {
        next = cur + 1;
      }

      var imageOut = new YAHOO.util.ColorAnim(images[cur], {opacity: { from: 1, to: 0 }});

      imageOut.onComplete.subscribe(function(e, anim) { 
        $D.removeClass(images[cur], 'active');
        $D.addClass(images[next], 'active');
        var imageIn = new YAHOO.util.ColorAnim(images[next], {opacity: { from: 0, to: 1 }});
        imageIn.animate();
      });

      imageOut.animate();

    },

    play: function() {



    },

    init: function() {

      $E.onAvailable('splash', function(){ 
        DLX.player = new Player(this);
      });

      $E.onAvailable('gallery', function(){ 

        var images = this.getElementsByTagName('li');
        var start = Math.floor(Math.random() * images.length);

        $D.setStyle(images, 'opacity', 0);
        $D.removeClass(images, 'hidden');
        $D.setStyle(images[start], 'opacity', 1);
        $D.addClass(images[start], 'active');
        $D.removeClass($('next'), 'hidden');

        fader = setInterval(DLX.imageFader, 5000); 
      })

      if($('addresses')) {
        var els = $('addresses').getElementsByTagName('li');
        var l = Math.ceil(els.length / 3);
        var col1 = document.createElement('ul');
        var col2 = document.createElement('ul');
        var col3 = document.createElement('ul');
        $D.addClass([col1, col2, col3], 'resultset');

        for(var i = 0; i < els.length; i++) {
          if(i < l) {
            col1.appendChild(els[i].cloneNode(true));
          } else if (i < (l * 2)) {
            col2.appendChild(els[i].cloneNode(true));
          } else if (i < (l * 3)) {
            col3.appendChild(els[i].cloneNode(true));
          }
        }

        var orig = $('addresses').getElementsByTagName('ul')[0];
        $('addresses').replaceChild(col1, orig);
        $('addresses').appendChild(col2);
        $('addresses').appendChild(col3);

      }

      if($('addresses') && !$('googlemaps')) {

        var gDialog = new YAHOO.widget.Dialog("gmap",
          { 
            draggable: false,
            height : "484px",
            width : "645px",
            fixedcenter : true,
            visible : false,
            modal: true,
            close: false,
            underlay: false,
            easing: YAHOO.util.Easing.easeBothStrong
          }
        );
        
        var dialogHead = document.createElement('div');
        var dialogClose = document.createElement('a');
        var dialogH1 = document.createElement('h1');
        dialogClose.id = 'gDialog-close';
        dialogClose.innerHTML = 'close';
        $D.addClass(dialogHead, 'photoViewer-header');
        $D.addClass(dialogClose, 'photoViewer-close');
        dialogHead.appendChild(dialogH1);
        dialogHead.appendChild(dialogClose);
        
        var dialogBody = document.createElement('div');
        var dialogMap = document.createElement('div');
        $D.addClass(dialogBody, 'photoViewer-imageCont');
        dialogMap.id = 'gDialog-map';
        dialogBody.appendChild(dialogMap);

        gDialog.setHeader(dialogHead);
        gDialog.setBody(dialogBody);

        gDialog.render(document.body);

        $D.addClass('gDialog', 'photoViewer-viewer');
        $D.addClass('gDialog_mask', 'photoViewer-mask');
        
        $E.on('gDialog-close', 'click', function(e) {
          $E.stopEvent(e);
          gDialog.hide();
        });

        $E.on($('addresses').getElementsByTagName('li'), 'click', function(e) {
          $E.stopEvent(e);
          DLX.gMap = new GMap2(document.getElementById("gDialog-map"));
          var mapTypeControl = new GMapTypeControl();
          var topRight = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,10));
          var bottomRight = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,10));
          DLX.gMap.addControl(mapTypeControl, topRight);
          DLX.gMap.addControl(new GLargeMapControl());

          var near = $D.getElementsByClassName(this.className, 'li', 'addresses');
          for(var i = 1; i < near.length; i++) {
            if(near[i] != this) {
              addToMap(near[i]);
            }
          }
          addToMap(this);

          gDialog.show();

        });
        
      }

      $E.onAvailable('googlemaps', function() {

        if (GBrowserIsCompatible()) {
          DLX.gMap = new GMap2(document.getElementById("googlemaps"));
          var mapTypeControl = new GMapTypeControl();
          var topRight = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,10));
          var bottomRight = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,10));
          DLX.gMap.addControl(mapTypeControl, topRight);
          DLX.gMap.addControl(new GLargeMapControl());

          var geocoder = new GClientGeocoder();

          if($('hq')) {
            var near = $D.getElementsByClassName($('hq').className, 'li', 'addresses');
            for(var i = 1; i < near.length; i++) {
              if(near[i] != $('hq')) {
                addToMap(near[i]);
              }
            }
            addToMap($('hq'));
          }

          if($('addresses')) {
            var addresses = $('addresses').getElementsByTagName('li');
            $E.on(addresses, 'click', function(e) {
              $E.stopEvent(e);
              var near = $D.getElementsByClassName(this.className, 'li', 'addresses');
              for(var i = 1; i < near.length; i++) {
                if(near[i] != this) {
                  addToMap(near[i]);
                }
              }
              addToMap(this);
            })
          }
        }
      });

      $E.onAvailable('secondxxx', function() {
        $E.on(this, 'click', function(e) {
          $E.stopEvent(e);
          var target = YAHOO.util.Event.getTarget(e);
          while (target != this) {
            if(target.nodeName.toLowerCase() == 'a' && target.parentNode.nodeName.toLowerCase() != 'h2') {
              window.location = target.href;
              break;
            } else if(target.nodeName.toLowerCase() == 'h2') {
              if($D.hasClass(target, 'active')) {
                $D.removeClass(target.parentNode.getElementsByTagName('ul'), 'active');
                $D.removeClass(target.parentNode.getElementsByTagName('h2'), 'active');
              } else {
                $D.removeClass(target.parentNode.getElementsByTagName('h2'), 'active');
                $D.removeClass(target.parentNode.getElementsByTagName('ul'), 'active');
                $D.addClass(target, 'active');
                $D.addClass($D.getNextSibling(target), 'active');
              }
              break;
            } else {
              target = target.parentNode; 
            }
          }
        });
      });

      $E.onAvailable('performance', function() {
        $D.addClass(this, 'graphic');
        var LIs = this.getElementsByTagName('li');
        for(var i = 0; i < LIs.length; i++) {
          LIs[i].innerHTML = LIs[i].innerHTML.replace(/[^0-9\.]*/, '');
          if(i == 0) {
            if(LIs[i].innerHTML.indexOf('.') != -1) {
              $D.addClass(LIs[i], 'decimal');
              $D.setStyle(LIs[i], 'paddingLeft', (LIs[i].innerHTML - 0.5) * 32+'px');
            } else {
              $D.setStyle(LIs[i], 'paddingLeft', (LIs[i].innerHTML - 1) * 32+'px');
            }
          }
        }
      });

      $E.onAvailable('colors', function() {

        var imgs = this.getElementsByTagName('img');

        if(!imgs.length) {
          imgs = [];
          var lis = this.getElementsByTagName('li');
          for (var i = 0; i < lis.length; i++) {
            var a = $D.getFirstChild(lis[i]);
            var img = new Image;
            $D.setStyle(img, 'opacity', '0');
            $D.setStyle(img, 'display', 'block');
            $D.setStyle(img, 'position', 'absolute');
            img.src = a.href;
            a.innerHTML = '';
            a.appendChild(img);
            imgs.push(img);
          }
        }

        $E.on(imgs, 'click', function(e) {

          $E.stopEvent(e);
          var detail = $('detail');
          $D.addClass(this, 'selected');

          var proxy = this.cloneNode(true);
          var proxy2 = detail.cloneNode(true);

          $D.setStyle(proxy2, 'width', $D.getStyle(detail, 'width'));
          $D.setStyle(proxy2, 'height', $D.getStyle(detail, 'height'));
          $D.setStyle(proxy2, 'position', 'absolute');
          $('wrapper').appendChild(proxy2);
          $D.setXY(proxy2, $D.getXY(detail));

          $D.setStyle(proxy, 'width', $D.getStyle(this, 'width'));
          $D.setStyle(proxy, 'height', $D.getStyle(this, 'height'));
          $D.setStyle(proxy, 'position', 'absolute');
          $('wrapper').appendChild(proxy);
          $D.setXY(proxy, $D.getXY(this));

          if($D.hasClass($('content'), 'rider')) {
            var attributes = {
              points: { 
                to: $D.getXY(proxy2), 
                control: [ [150, 100] ] },
              opacity: { 
                from: .2, 
                to: 1 },
              width: { 
                from: 60, 
                to: proxy.clientWidth },
              height: { 
                from: 40, 
                to: proxy.clientHeight }
            };
          } else {
            var attributes = {
              points: { 
                to: $D.getXY(proxy2), 
                control: [ [150, 100] ] },
              opacity: { 
                from: .2, 
                to: 1 },
              width: { 
                from: parseInt($D.getStyle(this, 'width').slice(0, -2), 10), 
                to: parseInt($D.getStyle(detail, 'width').slice(0, -2), 10) },
              height: { 
                from: parseInt($D.getStyle(this, 'height').slice(0, -2), 10), 
                to: parseInt($D.getStyle(detail, 'height').slice(0, -2), 10) }
            };
          }
          var anim = new YAHOO.util.Motion(proxy, attributes, .3, YAHOO.util.Easing.easeIn);

          if($D.hasClass($('content'), 'rider')) {
            var attributes2 = {
              points: { 
                to: $D.getXY(proxy), 
                control: [ [1000, 100] ] },
              opacity: { 
                from: .2, 
                to: 1 },
              width: { 
                from: parseInt($D.getStyle(detail, 'width').slice(0, -2), 10), 
                to: 60 },
              height: { 
                from: parseInt($D.getStyle(detail, 'height').slice(0, -2), 10), 
                to: 50 }
            };
            var anim3 = new YAHOO.util.Motion(detail, {height: { to: proxy.clientHeight }}, .4, YAHOO.util.Easing.easeOut);
          } else {
            var attributes2 = {
              points: { 
                to: $D.getXY(proxy), 
                control: [ [1000, 100] ] },
              opacity: { 
                from: .2, 
                to: 1 },
              width: { 
                from: parseInt($D.getStyle(detail, 'width').slice(0, -2), 10), 
                to: parseInt($D.getStyle(this, 'width').slice(0, -2), 10) },
              height: { 
                from: parseInt($D.getStyle(detail, 'height').slice(0, -2), 10), 
                to: parseInt($D.getStyle(this, 'height').slice(0, -2), 10) }
            };
          }

          var anim2 = new YAHOO.util.Motion(proxy2, attributes2, .4, YAHOO.util.Easing.easeOut);

          anim.onStart.subscribe(function() {
            $D.addClass(this.parentNode, 'disabled');
          }, this, true);

          anim2.onStart.subscribe(function() {
            $D.setStyle(this, 'visibility', 'hidden');
          }, $('detail'), true);

          anim.onComplete.subscribe(function() {
            $('detail').src = this.src;
            $D.setStyle($('detail'), 'visibility', 'visible');
            this.parentNode.removeChild(this);
          }, proxy, true);

          anim2.onComplete.subscribe(function() {
            var lis = $('colors').getElementsByTagName('li');
            for (var i = 0; i < lis.length; i++) {
              if($D.getFirstChild(lis[i]).src == this.src) {
                $D.removeClass(lis[i], 'disabled');
              }
            }
            this.parentNode.removeChild(this);
          }, proxy2, true);

          anim.animate();
          anim2.animate();
          if(anim3) {
            anim3.animate();
          }

        });
      });

      var inputs = $('wrapper').getElementsByTagName('input');
      for(var i = 0; i < inputs.length; i++) {
        if(inputs[i].getAttribute('type') == 'text' 
            && !$D.hasClass(inputs[i], 'standard')) { 
          inputs[i].value = inputs[i].getAttribute('alt');
        }
      }

      $E.on(inputs, 'focus', function(e) {
        if(this.getAttribute('type') != 'text'
            || $D.hasClass(this, 'standard')) { return; }
        if(this.value == this.getAttribute('alt')) {
          this.value = '';
        }
      });

      $E.on(inputs, 'blur', function(e) {
        if(this.getAttribute('type') != 'text'
            || $D.hasClass(this, 'standard')) { return; }
        if(this.value == '') {
          this.value = this.getAttribute('alt');
        }
      });

      $E.onAvailable('newsletter', function(e) {

        var str_email = 'e-mail address';

        $E.on(this.getElementsByTagName('input'), 'focus', function(e) {

          if(this.getAttribute('type') == 'submit') {
            return;
          }

          $D.addClass(this.parentNode.parentNode.parentNode, 'active');
          $('email').setAttribute('alt', str_email);

          $E.on($('close-newsletter'), 'click', function(e) {
            $D.removeClass(this.parentNode, 'active');
            if($('email').value == str_email) {
              $('email').setAttribute('alt', 'newsletter');
              $('email').value = 'newsletter';
            }
          });

        });

        $E.on(this.getElementsByTagName('input'), 'blur', function(e) { 
          if(this.getAttribute('type') != 'text') { return; }
          if(this.value == '') {
            this.value = this.getAttribute('alt');
          }
        });

        $E.on(this, 'submit', function(e) { 
          var ins = this.getElementsByTagName('input');
          for(var i = 0; i < ins.length; i++) {
            if(ins[i].getAttribute('type') == 'text') {
              if(ins[i].value == ins[i].getAttribute('alt')) {
                ins[i].value = '';
              }
            }
          }
        });
        
      });

      DLX.dialog = new YAHOO.widget.Dialog('video',
        { 
          draggable: false,
          height : "325px",
          width : "500px",
          fixedcenter : true,
          visible : false,
          modal: true,
          close: false,
          underlay: false,
          easing: YAHOO.util.Easing.easeBothStrong
        }
      );

      DLX.dialog.hideEvent.subscribe(function(){
        DLX.swf.removeSWF('video-player');
        $('video-player').parentNode.removeChild($('video-player'));
        DLX.dialog.setBody(body);
      });

      var kl = new YAHOO.util.KeyListener(document, { keys:27 },
        { fn: DLX.dialog.hide,
          scope: DLX.dialog,
          correctScope:true });

      var hd = document.createElement('span');
      hd.appendChild(document.createTextNode('close'));
      $D.setStyle(hd, 'cursor', 'pointer');
      $E.on(hd, 'click', function() { DLX.dialog.hide(); });
      DLX.dialog.setHeader(hd);
      DLX.dialog.cfg.queueProperty('keylisteners', kl);

      var video_links = $D.getElementsByClassName('video', 'a', 'wrapper');
      var plays = $D.getElementsByClassName('play', 'img', 'wrapper');
      $D.addClass(plays, 'active');

      if(video_links.length) {
        $E.on(video_links, 'click', function(e) {

          $E.stopEvent(e);

          var bd = document.createElement('div');
          var video = document.createElement('div');
          video.id = 'video-player';
          bd.appendChild(video);
          DLX.dialog.setBody(bd);
          DLX.dialog.render('wrapper');
          DLX.dialog.show();

          if($D.hasClass(this, 'vimeo')) {
            var id = this.href.slice(this.href.lastIndexOf('/')+1);
            var url = 'http://vimeo.com/moogaloop.swf?clip_id='+id+'&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1';
            DLX.swf.embedSWF(url, 'video-player', '491', '276', '9.0.0');
          } else {
            var url = 'http://www.youtube.com/v/'+this.href.substr(this.href.indexOf('=')+1);
            DLX.dialog.cfg.setProperty('width', '435px');
            DLX.dialog.cfg.setProperty('height', '384px');
            DLX.swf.embedSWF(url, "video-player", "425", "344", "9.0.0");
          }
        });
      }

    }
  };

}();

YAHOO.util.Event.onContentReady('content', DLX.init);
