/* Site */

function when(obj, fn) {
  if (Object.isString(obj)) obj = /^[\w-]+$/.test(obj) ? $(obj) : $(document.body).down(obj)
  if (Object.isArray(obj) && !obj.length) return
  if (obj) fn(obj)
}

var App = window.App||{};

String.prototype.parseColor = function() {  
  var color = '#';
  if (this.slice(0,4) == 'rgb(') {  
    var cols = this.slice(4,this.length-1).split(',');  
    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
  } else {  
    if (this.slice(0,1) == '#') {  
      if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
      if (this.length==7) color = this.toLowerCase();  
    }  
  }  
  return (color.length==7 ? color : (arguments[0] || this));  
};


App.Carousel = Class.create({
  initialize : function(element, options){
    this.element = $(element);
    this.options = Object.extend({
      autoplay: false,
      blank : 'img/carousel/blank.gif',
      next: 'a.next',
      previous : 'a.previous',
      scroll : 1,
      visible : 3,
      duration: 8,
      lazy: false,
      loop : false,
      wrap: false,
      transition : Effect.Transitions.sinoidal
    }, options||{});
    this.duration = ((11-this.options.duration)*0.15);
    this.index = 0;
    this.clip = this.element.down('div.clip');
    this.strip = this.clip.down('ul');
    this.items = this.strip.select('li');
    this.pages = Math.ceil(this.items.length/this.options.visible);
    
    this.width = this.items[0].scrollWidth;  
    if(!this.options.width){
      this.options.width = this.width*this.options.visible
    }
    
    if(this.options.lazy){
      $R(this.options.visible, this.item.length-1).each(function(n){
        this.items[n].select('img').each(function(image){
          image.className = 'loading';
          image._src = image.src;
          image.src = this.options.blank;
        }, this);
      }, this);
    }


    
    this.clip.setStyle({
      width: this.options.width+'px'
    });
    
    var w = (this.options.wrap) ? (this.width*this.items.length)*2 : this.width*this.items.length;
    
    this.strip.setStyle({
      marginLeft: 0,
      width: w+'px'
    });
    
    this.onclickListener = this.onclick.bindAsEventListener(this);
    this.element.observe('click', this.onclickListener);
    
    if(this.options.autoplay){
      this.auto = new PeriodicalExecuter(this.forward.bind(this), this.options.autoplay);
    }
    
    if(this.options.wrap){
      for(var i=0; i<this.options.visible; i++){
        this.strip.appendChild(this.items[i].cloneNode(true));
      }
      this.strip.setStyle({
        width: (this.width*(this.items.length+this.options.visible))+'px'
      });
    }
    
  },
  onclick : function(e){
    if(this.auto){
      this.auto.stop();
    }
    if(Event.findElement(e, this.options.next)){
      Event.stop(e);
      this.back();
    }else if(Event.findElement(e, this.options.previous)){
      Event.stop(e);
      this.forward();
    }
  },
  forward : function(){  
    var options = {};
    this.loopForward = (this.index==this.items.length-this.options.visible) ? true : false;
    this.loopBack = false;
    this.wrapForward = (this.index==this.items.length-this.options.scroll) ? true : false;
    this.wrapBack = false;
    
    if(this.wrapForward && this.options.wrap){
      options.afterFinish = function(){
        this.strip.setStyle({
          marginLeft: 0
        });
        this.index = 0;
        this.wrapForward = false;        
      }.bind(this);
    }    
    
    if(this.loopForward && this.options.loop){
      this.index = 0;
      this.loopForward = false;
    }else{  
      $R(this.index+this.options.visible, this.index+this.options.visible+this.options.scroll).each(function(i){
        if(this.items[i]){
          this.items[i].select('img.loading').each(function(image){
            image.className = '';
            image.src = image._src;
            image._src = false;
          }, this);
        }
      }, this);
      if(this.options.wrap){ 
        this.index=this.index+this.options.scroll;
      }else{
        this.index=Math.min(this.items.length-this.options.visible, this.index+this.options.scroll);
      }      
    }
    var offset = this.index*this.width;
    var style = -offset;    
    this.scroll(style, options);
  },
  back : function(){    
    this.loopBack = (this.index==0) ? true : false;
    this.loopForward = false;
    this.wrapBack = (this.index==0) ? true : false;
    this.wrapForward = false;
    
    if(this.wrapBack && this.options.wrap){
      this.index = this.items.length;
      var offset = this.index*this.width;
      var style = -offset;
      this.strip.setStyle({
        marginLeft: style+'px'
      });
    }
    
    if(this.loopBack && this.options.loop){
      this.index = this.items.length-this.options.visible;
      this.loopBack = false;
    }else{
      this.index=Math.max(0, this.index-this.options.scroll);    
    }
    var offset = -(this.index*this.width);    
    var style = offset;      
    this.scroll(style);
  },  
  scroll : function(style, options){
    new Effect.Morph(this.strip, Object.extend({
      style : {
        marginLeft: style+'px' 
      },
      duration: this.duration,
      transition: this.options.transition
    }, options||{})); 
  }
});

App.Lightbox = function(){
  var current;
  var groups = $H({});
  var Lightbox = {};
  var selects; 
    
  var Group = Class.create(Enumerable, {
    initialize : function(nodes){
      this.length = 0;
      this.first = null;
      this.last = null;    
      $A(nodes).each(function(node){
        this.append({
          data : node,
          prev : null,
          next : null
        });
      }, this);
    },
    append : function(node){
      if(this.first === null){
        this.first = node;
        this.last = node;
      }else{
        node.prev = this.last;
        this.last.next = node;
        this.last = node;
      }
      this.length++;    
    },
    _each : function(iterator){
      var node = this.first, n = this.length;
      for (var i = 0; i < n; i++) {
        iterator(node, i);
        node = node.next;
      }   
    } 
  });   
  
  function get_group(group){
    return groups.get(group)||groups.set(group, new Group());
  }
  
  function add_image(image){
    var group = get_group(image.rel||'default');
    group.append({
      data : {
        url : image.href
      },
      prev : null,
      next : null
    });
    image.observe('click', show);
  }
  
  function show(e){
    var image = Event.findElement(e, 'a.lightbox');
    if(image){
      Event.stop(e);
      var object = get_group(image.rel||'default').find(function(_image){
        return _image.data.url == image.href;
      });
      
      Lightbox.controlsOuter.setStyle({
        width: "auto"
      });			      
      
      Lightbox.element.setStyle({
        opacity: 1
      });
      Lightbox.controls.hide();
      Lightbox.img.hide();
      
      var viewport = document.viewport.getDimensions();
      var scroll = document.viewport.getScrollOffsets();
      
      Lightbox.image.setStyle({
        height: '200px',
        width: '200px',
        overflow: 'hidden'
      });
      
      Lightbox.element.show();
      
      var size = $(Lightbox.element).getDimensions();
      var _size = $(Lightbox.image).getDimensions();

      var left = (viewport.width/2)-(size.width/2);
      
      var top = Math.max(10, (viewport.height/2)-(size.height/2)+scroll.top);
    
      Lightbox.element.setStyle({
        left : left+"px",
        top : top+"px"
      });      
      load(object);
    }
  }
  
  function next(e){
    Event.stop(e);
    if(current.next){
      load(current.next);
    }
  }
  
  function prev(e){
    Event.stop(e);
    if(current.prev){
      load(current.prev);
    }
  }
  
  function close(e){
    Event.stop(e);
		new Effect.Opacity(Lightbox.element, {
			duration: 0.5, 
			from: 1, 
			to: 0,
			afterFinish : function(){
				Lightbox.element.hide();
			}.bind(this)
		});    
  }
  
  function load(object){
    Lightbox.close.hide();
    Lightbox.title.hide();  
    
    new Effect.BlindUp(Lightbox.controls, {
      duration: 0.5,
      afterFinish : function(){
        new Effect.Opacity(Lightbox.img, {
          duration: 0.5, 
          from: 1, to :0,
          afterFinish : function(){
            Lightbox.img.hide();
            var img = new Image();
            img.onload = onload.curry(object); 
            img.src = object.data.url;
          }
        });
      }
    });
  }
  
  function onload(object){ 
    var viewport = document.viewport.getDimensions();
    var scroll = document.viewport.getScrollOffsets();
    
    var size = $(Lightbox.element).getDimensions();
    var _size = $(Lightbox.image).getDimensions();
    
    var left = (viewport.width/2)-((size.width-_size.width+this.width)/2);
    var top = Math.max(10, (viewport.height/2)-((size.height-_size.height+this.height)/2)+scroll.top);
    
    var str = "left:"+left+"px;top:"+top+"px;";
    var _str = "width:"+this.width+"px;height:"+this.height+"px;";
    
    new Effect.Parallel([new Effect.Morph(Lightbox.element, {style : str}), new Effect.Morph(Lightbox.image, {style: _str})],
				{
				  afterFinish : function(){
            Lightbox.controlsOuter.setStyle({
              width: this.width+"px"
            });				  
				  
				    Lightbox.close.show();
            (object.prev) ? Lightbox.prev.show() : Lightbox.prev.hide();
            (object.next) ? Lightbox.next.show() : Lightbox.next.hide();				    
  				  Lightbox.img.src = object.data.url;
				    Lightbox.img.show();
  				  new Effect.Opacity(Lightbox.img, {
  				    duration: 0.5,
  				    from: 0,
  				    to: 1,
  				    afterFinish : function(){
  				      new Effect.BlindDown(Lightbox.controls, {
  				        duration: 0.5
  				      });
  				    }
  				  });
  				  current = object;
				  }.bind(this)
				}
		);    
  }
  
  function hideSelects(){			
	  if(Prototype.Browser.IE){
 			selects.invoke('hide');
 		}
	}
	
	function showSelects(){
    if(Prototype.Browser.IE){
  	  selects.invoke('show');
  	}
	}
	
	function build(){
    var lightbox = new Element('div', {className: 'dialogue'}).update('<div class="dialogue_inner"><div class="image"><div class="image_inner"><div class="loader"></div><img /></div></div><div class="controls_outer"><div class="controls"><a href="#" class="prev">Previous</a><a href="#" class="next">Next</a></div></div><div class="title">Title</div><div class="close"><a href="#" class="close">Close</a></div></div>');

    Lightbox.element = lightbox;
    Lightbox.img = lightbox.down('img');
    Lightbox.image = lightbox.down('div.image_inner');
    Lightbox.loader = lightbox.down('div.loader');
    Lightbox.controls = lightbox.down('div.controls');
    Lightbox.controlsOuter = lightbox.down('div.controls_outer');
    Lightbox.title = lightbox.down('div.title');    
    Lightbox.next = lightbox.down('a.next');
    Lightbox.prev = lightbox.down('a.prev');
    Lightbox.close = lightbox.down('a.close');
    
    Lightbox.next.observe('click', next);
    Lightbox.prev.observe('click', prev);
    Lightbox.close.observe('click', close);
    
    lightbox.hide();
    document.body.appendChild(lightbox);	  
	}
  
	return {
		initialize : function(){
		  var selects = $A(document.getElementsByTagName('select'));
		  this.add_images($$('a.lightbox'));
		  build();
		},
		add_images : function(links){
		  $A(links).each(function(link){
		    add_image(link);
		  });  
		}	
	}
}();

App.Navigation = function(){
  return {
    initialize : function(){
      $('primary-navigation').select('a.heading').each(function(a){        
        App.ReplaceImages.replace(a, {
          background: 'ffffff',
          font: 'futura_heavy.ttf',
          width: 'auto',
          size: 12,
          caps : true,
          hover: '841780'
        });
      }, this);  
      $('secondary-navigation').select('a.heading').each(function(a){
        App.ReplaceImages.replace(a, {
          background: 'ffffff',
          font: 'futura_heavy.ttf',
          width: 'auto',
          size: 12,
          caps : true,
          hover: '841780'
        });
      }, this);  
      
      var elements = $$('.navigation_module .first-child > a');
      if(elements.first()){
        App.ReplaceImages.replace(elements.first(), {
          color: '333333',
          background: 'f2f2f2',
          font: 'futura_heavy.ttf',
          width: 'auto',
          size: 12,
          caps : true
        });
      }
      
      var elements = $$('.sitemap_module > ul > li > a').each(function(a){
        App.ReplaceImages.replace(a, {
          color: '333333',
          background: 'ffffff',
          font: 'futura_heavy.ttf',
          width: 'auto',
          size: 12,
          caps : true
        });
      }, this);    
      
      var elements = $$('.sitemap_module > ul > li > span').each(function(a){
        App.ReplaceImages.replace(a, {
          color: '333333',
          background: 'ffffff',
          font: 'futura_heavy.ttf',
          width: 'auto',
          size: 12,
          caps : true
        });
      }, this);          
          
    }    
  }
}();

App.ReplaceImages = {
	url : "/img/site/headings/headings.php",
  initialize : function(){
    
    $$('.heading').each(function(element){
      var className = element.className;
      
      var font = 'futura_heavy.ttf';
      var caps = true;
      
      if(className.indexOf('f1')!=-1){
        font = 'futura_heavy.ttf'
        caps = true;
      }
      
      if(className.indexOf('f2')!=-1){
        font = 'futura_book.ttf'
        caps = true;
      }      
      
      if(className.indexOf('f3')!=-1){
        font = 'futura_book.ttf'
        caps = false;
      }       
      
      if(className.indexOf('f4')!=-1){
        font = 'helvetica_neue.ttf'
        caps = false;
      }           

			if(className.indexOf('h13')!=-1){
				this.replace(element, {
				  caps : caps,
				  size: 10, 
				  font: font
				});
				return;
			}     
      
      if(className.indexOf('h12')!=-1){
				this.replace(element, {
  				caps : caps,
				  size: 12, 
				  font: font
				});
				return;
			}
      
			if(className.indexOf('h14')!=-1){
				this.replace(element, {
  				caps : caps,
				  size: 11, 
				  font: font
				});
				return;
			}
			if(className.indexOf('h15')!=-1){
				this.replace(element, {
  				caps : caps,
				  size: 13, 
				  font: font
				});
				return;
			}    			
			if(className.indexOf('h16')!=-1){
				this.replace(element, {
  				caps : caps,
				  size: 14, 
				  font: font
				});
				return;
			}    		   
      if(className.indexOf('h20')!=-1){
				this.replace(element, {
  				caps : caps,
				  size: 16, 
				  font: font
				});
				return;
			}			       
			if(className.indexOf('h23')!=-1){
				this.replace(element, {
  				caps : caps,
				  size: 21, 
				  font: font
				});
				return;
			}        
			if(className.indexOf('h22')!=-1){
				this.replace(element, {
  				caps : caps,
				  size: 20, 
				  font: font
				});
				return;
			} 
    }, this);
    
  },
  replace : function(element, options){
  	if(!element.hasClassName('replaced')){
	  	element.addClassName('replaced');    
	  }
	  var color = (options.color) ? options.color : element.getStyle('color').parseColor('#000000').replace('#','');
	  var background = (options.background) ? options.background : element.getStyle('background-color').parseColor('#000000').replace('#','');

	  
	  var text = this.getText(element);
	  
	  
	  element.innerHTML = '';

	  
	  if(options.width=='auto'){
	    var w = 'auto';
	  }else{
	    var w = parseInt(element.getStyle('width'), 10);
	    if(Prototype.Browser.IE){
  	    w = w-parseInt(element.getStyle('padding-left'), 10)-parseInt(element.getStyle('padding-right'), 10); 
	    }
	  }
	  if(options.caps){
  	  text = text.toUpperCase();
	  }
	  //background='fffffe';
		var url = this.url+"?t="+escape(text)+"&c="+color+"&b="+background+"&s="+options.size+"&f="+options.font+'&w='+w;

		if(options.hover){
			var hover = (options.hover) ? options.hover : element.getStyle('color').parseColor('#000000').replace('#','');
		  var hover_url = this.url+"?t="+escape(text)+"&c="+hover+"&b="+background+"&s="+options.size+"&f="+options.font+'&w='+w;
		  this.preload(hover_url);
		}
		
		var holding = new Image();
		//holding.onload = this.draw.curry(element);
		
		holding.onload = function(){
  	  if(Prototype.Browser.IE){
  				var image = document.createElement('img');	
  				image.style.backgroundPosition = '0 0';
  				image.style.backgroundRepeat = 'no-repeat';
  				image.style.backgroundImage = "url("+this.src+")";
  				//image.style.backgroundColor = 'red';
  				image.style.width = this.width+'px';
  				image.style.height = this.height+'px';			
  				image.style.display = 'block';
  				image.alt = text;	
  				image.src = '/img/site/magic.png';
  				element.appendChild(image);
  				element.style.visibility = 'visible';	
  				element.style.display='block';	
  				
    	    if(options.hover){
    	      element.observe('mouseover', function(e){
    	        image.style.backgroundImage = "url("+hover_url+")";
    	      });
    	      element.observe('mouseout', function(e){
    	        image.style.backgroundImage = "url("+url+")";
    	      });  	      
    	    }  				
  				  
  	  }else{
    	  var img = new Image();
  	    img.src = this.src;
  	    img.style.display='block';
  	    element.appendChild(img);
  	    element.style.display='block';
  	    
  	    if(options.hover){
  	      element.observe('mouseover', function(e){
  	        img.src = hover_url;
  	      });
  	      element.observe('mouseout', function(e){
  	        img.src = url;
  	      });  	      
  	    }
  	    
  	  }
		}
		
		holding.src = url;
		
  },
  preload : function(url){
    var img = new Image();
    img.src = url;  
  },
	getText : function(element){
		if(typeof element == "string"){
			return element;
		}else{
			if(typeof element == "undefined"){
			  return element;
		  }
    }
    var text = "";
    var kids = element.childNodes;
    for(var i=0;i<kids.length;i++) {
    	if(kids[i].nodeType == 1){
    		text += this.getText(kids[i]);
	   	}else{
  	 		if(kids[i].nodeType == 3){
    			text += kids[i].nodeValue;
    		}
    	}
	  }
	  return text;
	},
	draw : function(element){
	  if(Prototype.Browser.IE){
				var image = document.createElement('img');	
				image.style.backgroundPosition = '0 0';
				image.style.backgroundRepeat = 'no-repeat';
				image.style.backgroundImage = "url("+this.src+")";
				image.style.width = this.width+'px';
				image.style.height = this.height+'px';			
				image.alt = text;	
				image.src = '/img/site/magic.png';
				element.appendChild(image);
				element.style.visibility = 'visible';		  
	  }else{
  	  var img = new Image();
	    img.src = this.src;
	    element.appendChild(img);
	  }
	}  
};

App.Directory = function(){
  var detail, fragments, index, items, mappings, nav;
  
  function add_listeners(){
    nav.observe('click', update_items);
    index.observe('click', load_item);
  }
  
  function update_items(e){
    if(e) e.stop();
    var link = e.findElement('a');
    if(link){
      var n = nav.down('li.selected');
      n.toggleClassName('selected');
      var l = link.up('li');
      l.toggleClassName('selected');
    
      var item = link.id.split('_')[1];
      var show_items = mappings[item];
      if(show_items){      
        var show_hide = index_items.partition(function(index_item){
          return show_items.include(index_item.id.split('_')[1]);
        });
        show_hide[0].invoke('show');
        show_hide[1].invoke('hide');
      }else{
        index_items.invoke('show');
      }
      
      /*
      var queue = [];
      
      show_hide[1].each(function(element){
        //console.log(element.style.width);
        if(element.style.width!='0px'){
          queue.push(new Effect.Scale(element, 0, {
            sync : true,
            scaleX : true,
            scaleY : false,
            scaleContent : false,
            scaleMode: { originalHeight: 110, originalWidth: 120 },
            scaleFrom: 100
          })); 
        }        
      });
      
      show_hide[0].each(function(element){
        queue.push(new Effect.Scale(element, 100, {
          sync : true,
          scaleX : true,
          scaleY : false,
          scaleContent : false,
          scaleMode: { originalHeight: 110, originalWidth: 120 },
          scaleFrom: 0
        })); 
      });      
      
      new Effect.Parallel(queue, {
        duration: 0.5
      });
      */
      
    }
  }
  
  function load_item(e){
    if(e) e.stop();
    var link = e.findElement('a');
    if(link){
      var parts = link.href.split('/');
      var parts = parts[parts.length-1].split(':');
      var url = '/'+parts[0]+'s/view/'+parts[1];
      new Ajax.Updater(detail, url, {
        method : 'get'
      });
    }
  }
  
  return {
    initialize : function(){
      fragments = {};
      mappings = {};
      
      var i = window.categoryItems.length;      
      do {
        var wi = window.categoryItems[i-1];
        mappings[wi.id]=$A(wi.items);
      }while(--i);  
      
      detail = $('directory_detail');
      index = $('directory_index');
      index_items = index.select('li');
      nav = $('directory_nav');
      
      add_listeners();      
    }
  }
}();

document.observe("dom:loaded", function(){
  App.ReplaceImages.initialize();
  App.Lightbox.initialize();
  App.Navigation.initialize();
  
  if(Prototype.Browser.IE){
    $('primary-navigation-list').immediateDescendants().each(function(li){
      li.observe('mouseover', function(e){
        li.addClassName('hover');
      });
      li.observe('mouseout', function(e){
        li.removeClassName('hover');
      });      
    });
  }
  
  when('directory_index', App.Directory.initialize);
  when('html_carousel', function(element){
    new App.Carousel(element, {
      wrap: true,
      width: 590
    });
  });
  
});