/*!
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 */


/*
 * IBS - JavaScript
 * Copyright 2009. All rights reserved.
 *
 * Description: Global Variables, avoid when possible.
 */

var arbiter = new Events(); // Global event handler

/*
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 *
 * Class: Cape
 * Description: An accordion-like widget that gets covered by a silkscreen.
 */
var Cape = new Class({
  Implements: Options,
  Binds: ['toggle', 'expand', 'collapse'],
  options:
  {
    cls: 'w_cape',
    container: null,
    offset: {x: 0, y: 0}
  },
  initialize: function(element, togglers, contents, options)
  {
    this.setOptions(options);
    var opts = this.options;
    this.fx = new Object();
    this.arbiter = new Events();
    this.arbiter.isLocked = false;
    this.element = element = document.id(element);

    if ($defined(element) && togglers.length && contents.length && element.hasClass(opts.cls))
    {
      this.togglers = togglers;
      this.contents = contents;

      if (opts.container == null)
      {
        opts = this.setOptions(
        {
          container: element
        }).options;
        
        this.silk = new Element('div',
        {
          'class': opts.cls+'_silk',
          styles:
          {
            visibility: 'hidden',
            height: $(opts.container).getSize().y
          }
        }).inject($(opts.container));
        
        this.fx.silk = new Fx.Morph(this.silk,
        {
          transition: Fx.Transitions.Sine.easeIn,
          duration: 400
        });
      }
      
      togglers.each(function(tog, idx)
      {
        tog.store('isOpen', false);
        tog.addEvent('click', this.toggle.pass(idx));
      }.bind(this));
    }
  },
  toggle: function(idx)
  {
    if (!this.togglers[idx].retrieve('isOpen'))
    {
      this.expand(idx);
    }
    else
    {
      this.collapse(idx);
    }
  },
  expand: function(idx)
  {
    if (!this.arbiter.isLocked)
    {
      this.arbiter.isLocked = true;
      var opts = this.options, silk_s, silk_w, silk_h;
      this.silk.store('bg', this.silk.getStyle('background-color'));
      this.silk.store('s', this.silk.getSize());
      this.silk.setStyles(
      {
        height: 0,
        visibility: 'visible',
        'background-color': 'transparent'
      });
      this.togglers[idx].addClass(opts.cls+'_tog_active');
      silk_s = this.silk.retrieve('s');
      silk_w = silk_s.x;
      silk_h = silk_s.y;
      this.fx.silk.start(
      {
        top: [this.togglers[idx].getPosition().y-opts.container.getPosition().y+10, 0],
        width: [Math.floor(silk_w/4), Math.floor(silk_w/1.2)],
        height: [Math.floor(silk_h/6), Math.floor(silk_h/1.2)],
        border: ['1px dotted #555', '1px dotted #555']
      }).chain(function()
      {
        this.silk.setStyles(
        {
          width: silk_w,
          height: silk_h,
          border: 'none',
          'background-color': this.silk.retrieve('bg')
        });
  
	      new Element('div',
        {
          'class': opts.cls+'_close',
          events:
					{
						click: this.collapse.pass(idx)
					}
        }).inject(this.silk);     
	
        new Element('div',
        {
          'class': opts.cls+'_title',
          html: this.togglers[idx].get('html')
        }).inject(this.silk);
  
        new Element('div',
        {
          'class': opts.cls+'_defn',
          html: this.contents[idx].get('html')
        }).inject(this.silk);
        
        this.togglers[idx].store('isOpen', true);
        this.arbiter.isLocked = false;
        this.togglers[idx].removeClass(opts.cls+'_tog_active');

        this.silk.addEvent('click', this.toggle.pass(idx));
      }.bind(this));
    }
  },
  collapse: function(idx)
  {
    var opts = this.options;
    if (!this.arbiter.isLocked)
    {
			this.silk.removeEvents('click');
			
      this.arbiter.isLocked = true;
      this.silk.empty();
      this.silk.setStyles(
      {
        visibility: 'hidden'
      });
      this.togglers[idx].store('isOpen', false);
      this.arbiter.isLocked = false;
    }
  }
});/*
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 *
 * Class: Nav
 * Description: IBS Nav, navigation states tracking.
 */
var Nav = new Class
({
  Implements: Options,
  initialize: function(element, options)
  {
    var nav = element = this.element = $(element), nav_items = [];
    
    element.getElements('li').each(function(li)
    {
      if (li.getParent().getParent().get('tag') == 'div')
      {
        nav_items.push(li);
      }
    });

    nav_items.each(function(nav_item)
    {
      nav_item.addEvents(
      {
        mouseenter: function()
        {
          this.addClass('active');
        },
        mouseleave: function()
        {
          this.removeClass('active');
        }
      });
    });
    
    if ($defined(nav) && Browser.Engine.trident && Browser.Engine.version <= 4)
    {
      nav.getElements('li').each(function(li)
      {
        if (li.getParent().getParent().get('tag') != 'li')
        {
          li.addEvents(
          {
            mouseenter: function()
            {
              this.addClass('hover');
            },
            mouseleave: function()
            {
              this.removeClass('hover');
            }
          });
        }
      });
    }
  }
});

/*
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 *
 * Class: Page
 * Description: Parent holder of per page scripts.
 *              This class is here only to ensure item returned if of Page parent.
 */
var Page = new Class
({
  Implements: Options,
  initialize: function(options) {}
});

/*
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 *
 * Class: Site
 * Description: Provides a clean init sequence.
 */
var Site = new Class
({
  Implements: Options,
  initialize: function(options)
  {
    var bdy = $(document.body), page;
    this.id = id = bdy.get('id');

    this.nav = new Nav('nav');

    this.fixMac();

    if (bdy.hasClass('js'))
    {
      try
      {
        eval('page = new Page.'+id.capitalize()+'()');
        if (!(page instanceof Page))
        {
          throw ("Invalid page object: "+id);
        }
      }
      catch(e)
      {
        alert(e.fileName+'\n'+e.name+': '+e.lineNumber+'\n'+e.message);
      }
    }  
  },
  fixMac: function()
  {
		var isMac = Browser.Platform.mac, pmLeft, nsLeft, isHm = (this.id == 'hm');
    if (isMac)
		{
			pmLeft = isHm ? 74 : 121;
			$('n_sub_pm').setStyles(
			{
				left: pmLeft
			});
			nsLeft = isHm ? 270 : 306;
			$('n_sub_ns').setStyles(
			{
				left: nsLeft
			});
		}
  }
});

/*
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 *
 * Class: XNfo
 * Description: eXtended iNformation: Allows any element to inherit stylized tooltips when hovered and a html preview when clicked.
 */
var XNfo = new Class({
  Implements: Options,
  Binds: ['showPreview', 'hideBox'],
  options:
  {
    cls: 'w_xnfo',
    tip_property: 'title',
    container: null,
    offset: {x: 0, y: 0},
    img_offset: {x: 0, y: 20},
    prv_size: {x: 668, y: 0}
  },
  initialize: function(element, options)
  {
    this.setOptions(options);
    var opts = this.options;
    this.fx = new Object();
    this.arbiter = new Events();
    this.arbiter.isLocked = false;
    
    this.element = element = document.id(element);
    if ($defined(element) && element.hasClass(opts.cls))
    {
      if (opts.container == null)
      {
        opts = this.setOptions(
        {
          container: element
        }).options;
      }
      
      this.makePreview(element);
      this.makeTip();
      this.makeEvents(element);
    }
  },
  makeEvents: function(element)
  {
    var opts = this.options;
    
    element.addEvent('click', function(e)
    {
      e.stop();
      this.showBox();
    }.bind(this));
    
    this.box.addEvent('click', this.hideBox);
  },
  showBox: function()
  {
    var opts = this.options, element = this.element, container = opts.container, dload = this.dload, inner = this.inner, preview, img_h;

    this.box.addClass(opts.cls+'_box_active');
    this.tip.hide();
    if (dload.get('html') != '')
    {
      this.inner.addClass(opts.cls+'_box_spin');
      img_h = JSON.decode(element.get('rel')).size.y+opts.img_offset.y;      
      
      this.fx.inner.start(
      {
        height: [0, img_h] 
      }).chain(function()
      {
        new Asset.image(element.get('href'), { onload: function()
        {
          (function()
          {
            this.inner.removeClass(opts.cls+'_box_spin');
            
            this.preview = preview = new Element('img',
            {
              src: element.get('href'),
              'class': opts.cls+'_box_img'
            }).inject(this.inner);
            
            this.dload.destroy();
          }.bind(this)).delay(100);
        }.bind(this)});
      }.bind(this));
    }
  },
  hideBox: function()
  {
    var opts = this.options;
    this.box.removeClass(opts.cls+'_box_active');
  },
  makePreview: function(element)
  {
    var opts = this.options, cls = opts.cls, div = 'div', container = opts.container, box, inner, footer, dload, boxLeft, isIE6 = (Browser.Engine.version == '4' && Browser.Engine.trident);
    
    boxLeft = isIE6 ? -10 : 0;
    
    this.box = box = new Element(div,
    {
      'class': opts.cls+'_box',
      styles:
      {
        position: 'absolute',
        top: 0,
        left: boxLeft,
        width: opts.prv_size.x
      }
    }).inject(container);
    
    this.btn_close = btn_close = new Element(div,
    {
      'class': opts.cls+'_box_close'
    }).inject(box);
    
    this.inner = inner = new Element(div,
    {
      'class': opts.cls+'_box_inner'
    }).inject(box);

    this.dload = dload = new Element('span',
    {
      'class': opts.cls+'_box_load',
      html: element.get('href'),
      styles:
      {
        display: 'none'
      }
    }).inject(inner);

    footer = new Element(div,
    {
      'class': opts.cls+'_box_footer',
      html: element.get('title')
    }).inject(box);
    
    this.fx.inner = new Fx.Morph(this.inner);
  },
  makeTip: function()
  {
    var opts = this.options, ltIE7 = Browser.Engine.trident && !(document.querySelectorAll), isIE8 = (Browser.Engine.trident && document.querySelectorAll), offset;
    
    if (ltIE7)
    {
      offset = { x: 16, y: 16 };
    }
    else
    {
      if (isIE8)
      {
        offset = { x: 0, y: -2 };
      }
      else
      {
        offset = { x: 0, y: 12 };
      }
    }
    
    this.tip = new Tips(this.element,
    {
      text: '',
      className: opts.cls+'_tips',
      fixed: !ltIE7,
      offset: offset
    });

    if (!ltIE7)
    {
      this.tip.addEvent('show', function(tip)
      {
        var tip_size = tip.getCoordinates(), el_size = this.element.getElement('img').getSize(), new_top, new_left;
        
        new_top = (tip_size.top-el_size.y-tip_size.height);
        new_left = tip_size.left - Math.round((tip_size.width - el_size.x) / 2);
  
        tip.setStyles(
        {
          top: new_top,
          left: new_left
        });
      }.bind(this));
    }
  }
});/*
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 *
 * Class: Page.Hm
 * Description: Homepage
 */
Page.Hm = new Class
({
  Implements: Options,
  Extends: Page,
  initialize: function(options)
  {
    this.parent(options);
    return this;
  }
});

/*
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 *
 * Class: Page.Ii
 * Description: IBS 10.0i
 */
Page.Ii = new Class
({
  Implements: Options,
  Extends: Page,
  initialize: function(options)
  {
    this.parent(options);
    
    var cape = $('ii_list'), xnfos = $$('.w_xnfo');
    new Cape(cape, cape.getElements('dt'), cape.getElements('dd'));
    
    xnfos.each(function(xnfo)
    {
      new XNfo(xnfo,
			{
				container: $('ii_imgstrip')
			});
    });
    
    return this;
  }
});

/*
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 *
 * Class: Page.It
 * Description: IBS Team
 */
Page.It = new Class
({
  Implements: Options,
  Extends: Page,
  initialize: function(options)
  {
    this.parent(options);
		
		var cape = $('it_bios');
		new Cape(cape, cape.getElements('dt'), cape.getElements('dd'));
		
    return this;
  }
});

/*
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 *
 * Class: Page.Ns
 * Description: Network Services - Home
 */
Page.Ns = new Class
({
  Implements: Options,
  Extends: Page,
  initialize: function(options)
  {
    this.parent(options);
		
		var cape = $('ns_list');
		new Cape(cape, cape.getElements('dt'), cape.getElements('dd'));
		
    return this;
  }
});

/*
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 *
 * Class: Page.Pm
 * Description: Project Management
 */
Page.Pm = new Class
({
  Implements: Options,
  Extends: Page,
  initialize: function(options)
  {
    this.parent(options);
		
		var cape = $('pm_features');
		new Cape(cape, cape.getElements('dt'), cape.getElements('dd'));
		
    return this;
  }
});

/*
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 *
 * Class: Page.Tc
 * Description: IBS Training
 */
Page.Tc = new Class
({
  Implements: Options,
  Extends: Page,
  initialize: function(options)
  {
    this.parent(options);
		
		var cape = $('tc_list');
		new Cape(cape, cape.getElements('dt'), cape.getElements('dd'));
		
    return this;
  }
});

/*
 * IBS - JavaScript
 * Copyright 2009 IBS All rights reserved.
 *
 * Main Entry Point
 */
window.addEvent('domready', function()
{
  try
  {
    site = new Site();
  }
  catch(e)
  {
    alert(e.fileName+'\n'+e.name+': '+e.lineNumber+'\n'+e.message);
  }
});

