var Site = {

    Init: function(){
    
        ieSix = Browser.Engine.trident4;
        ie = Browser.Engine.trident;
		
        Site.setScrollOffset();
        Site.initScroller();
        pageScroller.toTop();
        Site.internalLinks();
        Site.navFx();
		Site.initStyleSwitcher();
		Site.styleSwitch();
		Site.initTips(".tip");
		Site.initTabs();
    },
    
    ReInit: function(){
        //called on window.resize
        Site.setScrollOffset();
        Site.initScroller();
        // IE6 has a disappearing div bug, so need to reset the page... grrrrr!
        if (ieSix) {
            pageScroller.toTop()
        }
            },
    
    setScrollOffset: function(){
        vport = window.getSize();
        vport = vport.y;
        contentH = document.getElement('.section-wrapper').getSize();
        footerH = $('page-footer').getSize();
        scrollOffset = -(((vport) - (contentH.y + footerH.y)) / 2);
        // use for debug
        // alert('scrollOffset: ' + scrollOffset + '\nvport: ' + vport + ' / contentH: ' + contentH.y + ' / footerH: ' + footerH.y);
    },
    
    initScroller: function(){
/*		if (!ie) {
			$$('div.section-wrapper').setStyle('opacity', 0.55);
			$(document.body).getElement('div.section-wrapper').setStyle('opacity', 1);
		}
*/        pageScroller = new Fx.Scroll(window, {
            duration: 1500,
            transition: 'quart:in:out',
            link: 'chain',
            offset: {
                'x': 0,
                'y': scrollOffset
            }
        });
    },
    
    // create left-hand nav fx
    navFx: function(){
        navEls = $$('#nav-wrap a');
        navEls[0].addClass('current').morph('.current');
        navEls.each(function(el){
        
            var navFxOut = new Fx.Morph(el, {
                duration: 800,
                transition: 'sine:out',
                link: 'cancel'
            });
            
            el.addEvents({
                'mouseenter': function(){
                    if (!el.hasClass('current')) {
                        navFxOut.cancel();
                        el.setStyles({
                            'background-color': '#d9d9d9',
                            'color': '#333'
                        });
                    }
                },
                'mouseleave': function(){
                    if (!el.hasClass('current')) 
                        navFxOut.start('.out');
                },
                'click': function(ev){
                    ev.stop();					
                    pageScroller.toElement(el.get('rel'));
					var isActive = $('nav-wrap').getElement('.current');

/*				if (!ie) {
					$('right_col').getElement(el.get('href')).set('tween', {duration:1800, transition: 'quad:in:out'}).tween('opacity', 1);
					if (isActive.get('rel') !== el.get('rel')) {
						$('right_col').getElement(isActive.get('href')).set('tween', {duration:1800, transition: 'quad:in:out'}).tween('opacity', 0.55);
						}
					}                  
*/				    if (isActive) 
                        isActive.removeClass('current').set('morph', {duration: 1700, transition: 'quad:out'}).morph('.out');
                    el.addClass('current').set('morph', {duration: 1500, transition: 'quad:in'}).morph('.current');
                }
            });
        });
        
    },
    
    // various hyperlink handlers
    internalLinks: function(){
    
        intLinks = $$('#right_col a', '#footer-content a');
        
        intLinks.each(function(el, i){
            if (el.getProperty('rel') == 'external') {
                el.set('target', '_blank');
                tmpTitle = el.get('title') ? el.get('title') + ' [in new window]' : tmpTitle = el.get('href') + ' [in new window]';
                el.set('title', tmpTitle);
                return;
            }
            
            if (!el.getProperty('href').match('#')) 
                return;
            
            linkType = el.getParent('p').getProperty('class');
            
            switch (linkType) {
				
				case 'next':
					var fn = el.getProperty('rel').split(':');
            		var tabClass = fn[0];
					var tabTo = fn[1];
					 el.addEvent('click', function(ev){
                        ev.stop();
                        window[tabClass].show(tabTo);
                    });
				
					break;
                    
                case 'top':
                    var sectionScroller = new Fx.Scroll(el.getParent('div.content-wrapper'), {
                        duration: 800,
                        transition: 'quart:in:out'
                    });
                    el.addEvent('click', function(ev){
                        ev.stop();
                        sectionScroller.toTop();
                    });
                    break;
                    
                case 'close':
                    var closeFx = new Fx.Slide(el.getParent('div'));
                    el.addEvent('click', function(ev){
                        ev.stop();
                        closeFx.slideOut('vertical');
                    });
                    break;
                    
                default:
                    // internal page nav link
                    el.addEvent('click', function(ev){
                        ev.stop();
                        target = el.get('rel');
						var isActive = $('nav-wrap').getElement('.current');
/*						if (!ie) {
							$('right_col').getElement('#'+target).set('tween', {duration:1800, transition: 'quad:in:out'}).tween('opacity', 1);
							if (isActive.get('rel') !== target) {
								$('right_col').getElement(isActive.get('href')).set('tween', {duration:1800, transition: 'quad:in:out'}).tween('opacity', 0.55);
								}
						}
*/						
                        if (isActive) 
                            isActive.removeClass('current').morph('.out');
                        $('main-nav').getElement('a[rel=' + target + ']').addClass('current').morph('.current');
                        pageScroller.toElement(target);
                    });
                    break;
            }
        });
    },
    
    initStyleSwitcher: function(){
        linksAry = [];
        $$('#style-switcher a').each(function(el){
            var relAtt = el.getProperty('rel');
            linksAry.push(relAtt);
            el.addEvent('click', function(ev){
                ev.stop();
                Site.styleSwitch('set', relAtt);
                var isActive = $('style-switcher').getElement('.selected');
                if (isActive) 
                    isActive.removeClass('selected');
                el.addClass('selected');
            })
        })
    },
    
    styleSwitch: function(mode, setstyle){
    
        var altSheets = $$('link[rel^=alternate]');
		var stylePath = "/css/themes/";
        var dur = 7; // cookie duration
		
        var cookieVar = Cookie.read("StylePref");
        if (cookieVar == null) {
            var cookieVar = linksAry.getRandom();
            Cookie.write('StylePref', cookieVar, {path: "/"});
			}
        
        switch (mode) {
			
            case 'set':
				if (!ieSix) {
					altSheets.each(function(el){
						el.disabled = true;
						if (el.get('id') == setstyle) {el.disabled = false;}
						}); 
					} else {
						// IE7.js breaks the above function for IE6, so here's a workaround
						new Asset.css(stylePath + setstyle +'.css', {id: setstyle});
					}
					
                Cookie.write('StylePref', setstyle, {duration: dur,path: "/"});
                break;
                
            case 'unset':
                Cookie.dispose('StylePref');
                break;
                
            default:
                altSheets.each(function(el){
				   el.disabled = true;
				   if (el.get('id') == cookieVar) {el.disabled = false;}
                });
                $('style-switcher').getElement('a[rel=' + cookieVar + ']').addClass('selected');
                break;
        }
    },
    
    initTabs: function(){
		var useTransition = (ie) ? false : true; // opacity transition is ugly in IE
		
		tabSkills = new TabSwapper({
		selectedClass: 'active',
		mouseoverClass: 'tab-over',
		tabs: $$('#skills-tabs li'),
		sections: $$('#skills div.tabs-panel'),
		smooth: useTransition,
		smoothSize: false,
		effectOptions: {duration: 500},
		onActive: function(id, el){
			tabScroller = new Fx.Scroll(el.getParent()).set(0,0);
			}
		});
		
		tabEmp = new TabSwapper({
		selectedClass: 'active',
		mouseoverClass: 'tab-over',
		tabs: $$('#employment-tabs li'),
		sections: $$('#employment div.tabs-panel'),
		smooth: useTransition,
		smoothSize: false,
		effectOptions: {duration: 500},
		onActive: function(id, el){
			tabScroller = new Fx.Scroll(el.getParent()).set(0,0);
			}
		});	
		
		tabWeb = new TabSwapper({
		selectedClass: 'active',
		mouseoverClass: 'tab-over',
		tabs: $$('#websites-tabs li'),
		sections: $$('#websites div.tabs-panel'),
		smooth: useTransition,
		smoothSize: false,
		effectOptions: {duration: 500},
		onActive: function(id, el){
			tabScroller = new Fx.Scroll(el.getParent()).set(0,0);
			}
		});	
    },
    
    initTips: function(tip_class){
    
        tipTriggers = $$(tip_class);
        
        /* emulate Tips behaviour from MooTools 1.11, using 'title' for tip:title and tip:text
         i.e. title="Tip title :: Tip text"
         MooTools 1.2 release uses 'title' for tip:title, and 'rel' (or 'href') for tip:text) */
        tipTriggers.each(function(el){
            var full_title = el.getProperty('title');
            var dual = full_title.split('::');
            var tip_title = dual[0].trim();
            var tip_text = dual[1].trim();
            el.store('tip:title', tip_title);
            el.store('tip:text', tip_text);
        });
        
        // create tool tips
        var tips = new Tips(tipTriggers, {
            onShow: function(tip){
                tip.fade('in');
            },
            onHide: function(tip){
                tip.fade('out');
            },
            showDelay: 200,
            hideDelay: 100,
            offsets: {
                'x': 18,
                'y': 30
            }
        });
        // set tween duration ('normal' is default)
        //tips.tip.set('tween',{duration: 'short'});
    }
    
};

// initialise site on DOM load
window.addEvent('domready', Site.Init);
// reinitialise on window resize
window.addEvent('resize', Site.ReInit);
