/*
    Common Util 1.2.2
    
    Copyright (c) 2010 STRAIGHTLINE<http://www.straightline.jp/> All rights reserved.
*/

/*
---------------------------------------------------------------------------------------------------

script: Tips.js

description: Class for creating nice tips that follow the mouse cursor when hovering an element.
             Based on More 1.2.4.4.
             Modified by STRAIGHTLINE. 2010/05/12

license: MIT-style license

authors:
- Valerio Proietti
- Christoph Pojer

requires:
- core:1.2.4/Options
- core:1.2.4/Events
- core:1.2.4/Element.Event
- core:1.2.4/Element.Style
- core:1.2.4/Element.Dimensions
- /MooTools.More

provides: [Tips]

...
*/

(function(){

var read = function(option, element){
	return (option) ? ($type(option) == 'function' ? option(element) : element.get(option)) : '';
};

this.Tips = new Class({

	Implements: [Events, Options],

	options: {
		/*
		onAttach: $empty(element),
		onDetach: $empty(element),
		*/
		onShow: function(){
			this.tip.setStyle('display', 'block');
		},
		onHide: function(){
			this.tip.setStyle('display', 'none');
		},
		title: 'title',
		text: function(element){
			return element.get('rel') || element.get('href');
		},
		showDelay: 100,
		hideDelay: 100,
		className: 'tip-wrap',
		offset: {x: 16, y: 16},
		windowPadding: {x:0, y:0},
		fixed: false
	},

	initialize: function(){
		var params = Array.link(arguments, {options: Object.type, elements: $defined});
		this.setOptions(params.options);
		if (params.elements) this.attach(params.elements);
		this.container = new Element('div', {'class': 'tip'});
	},

	toElement: function(){
		if (this.tip) return this.tip;

		return this.tip = new Element('div', {
			'class': this.options.className,
			styles: {
				position: 'absolute',
				top: 0,
				left: 0
			}
		}).adopt(
			new Element('div', {'class': 'tip-top'}),
			this.container,
			new Element('div', {'class': 'tip-bottom'})
		).inject(document.body);
	},

	attach: function(elements){
		$$(elements).each(function(element){
			var title = read(this.options.title, element),
				text = read(this.options.text, element);
			
			element.erase('title').store('tip:native', title).retrieve('tip:title', title);
			element.retrieve('tip:text', text);
			this.fireEvent('attach', [element]);
			
			var events = ['enter', 'leave'];
			if (!this.options.fixed) events.push('move');
			
			events.each(function(value){
				var event = element.retrieve('tip:' + value);
				if (!event) event = this['element' + value.capitalize()].bindWithEvent(this, element);
				
				element.store('tip:' + value, event).addEvent('mouse' + value, event);
			}, this);
		}, this);
		
		return this;
	},

	detach: function(elements){
		$$(elements).each(function(element){
			['enter', 'leave', 'move'].each(function(value){
				element.removeEvent('mouse' + value, element.retrieve('tip:' + value)).eliminate('tip:' + value);
			});
			
			this.fireEvent('detach', [element]);
			
			if (this.options.title == 'title'){ // This is necessary to check if we can revert the title
				var original = element.retrieve('tip:native');
				if (original) element.set('title', original);
			}
		}, this);
		
		return this;
	},

	elementEnter: function(event, element){
		this.container.empty();
		
		['title', 'text'].each(function(value){
			var content = element.retrieve('tip:' + value);
			if (content) this.fill(new Element('div', {'class': 'tip-' + value}).inject(this.container), content);
		}, this);
		
		$clear(this.timer);
		this.timer = (function(){
			this.show.run([element], this);
			this.position((this.options.fixed) ? {page: element.getPosition()} : event);
		}).delay(this.options.showDelay, this);
	},

	elementLeave: function(event, element){
		$clear(this.timer);
		this.timer = (function() { this.hide.run([element],this); }.bind(this)).delay(this.options.hideDelay);
		this.fireForParent(event, element);
	},

	fireForParent: function(event, element){
		element = element.getParent();
		if (!element || element == document.body) return;
		if (element.retrieve('tip:enter')) element.fireEvent('mouseenter', event);
		else this.fireForParent(event, element);
	},

	elementMove: function(event, element){
		this.position(event);
	},

	position: function(event){
		if (!this.tip) document.id(this);

        this.tip.removeClass('tip-overflow');
        
		var size = window.getSize(), scroll = window.getScroll(),
			tip = {x: this.tip.offsetWidth, y: this.tip.offsetHeight},
			props = {x: 'left', y: 'top'},
			obj = {};
		
		for (var z in props){
			obj[props[z]] = event.page[z] + this.options.offset[z];
			if ((obj[props[z]] + tip[z] - scroll[z]) > size[z] - this.options.windowPadding[z]) {
                obj[props[z]] = event.page[z] - this.options.offset[z] - tip[z];
                this.tip.addClass('tip-overflow');
            }
		}
		
		this.tip.setStyles(obj);
	},

	fill: function(element, contents){
		if(typeof contents == 'string') element.set('html', contents);
		else element.adopt(contents);
	},

	show: function(element){
		if (!this.tip) document.id(this);
		this.fireEvent('show', [this.tip, element]);
	},

	hide: function(element){
		if (!this.tip) document.id(this);
		this.fireEvent('hide', [this.tip, element]);
	}

});

})();
/*
---------------------------------------------------------------------------------------------------
*/


/* 
    Anchor Effect 1.0.3
*/
var AnchorEffect = new Class({
    Implements: Options,
    options: {
        ajaxLoaderSrc: 'ajax-loader.gif',
        isFadeOutJump: true,
        enterDuration: 300,
        enterTransition: 'expo:out',
        leaveDuration: 300,
        leaveTransition: 'expo:out',
        color: '#bbb',
        imgOpacity: 0.7
    },
    initialize: function(options) {
        this.setOptions(options);
        
        var isIE6 = false;
        if (Browser.Engine.trident && Browser.Engine.version < 5) {
            return;
        }
        $$('a').each(function(a) {

            a.store('defaultColor', a.getStyle('color'));
            
            if (this.options.isFadeOutJump && a.getProperty('href').contains('#') == false) {
                a.addEvent('click', function(event) {
                    event.stop();
                    
                    if ($('ajax-loader')) {
                        $('ajax-loader').setStyle('opacity', 1);
                    }
                    var overlay = new Element('div', {
                        styles: {
                            position: 'absolute',
                            top: 0,
                            left: 0,
                            width: window.getScrollSize().x,
                            height: window.getScrollSize().y,
                            'background-color': $(document.body).getStyle('background-color'),
                            'z-index': 99999,
                            opacity: 0
                        }
                    });
                    $(document.body).adopt(overlay);
                    overlay.set('tween', {
                        duration: 'short',
                        onComplete: function() {
                            location.href = a.getProperty('href');
                        }
                    });
                    overlay.tween('opacity', 1);
                }.bind(this));
            }
            
            a.addEvents({
                mouseenter: function() {
                    a.get('tween', {
                        property: 'color',
                        duration: this.options.enterDuration,
                        transition: this.options.enterTransition,
                        link: 'cancel'
                    }).start(this.options.color);
                    a.getElements('img').each(function(img) {
                        img.get('tween', {
                            property: 'opacity',
                            duration: this.options.enterDuration,
                            transition: this.options.enterTransition,
                            link: 'cancel'
                        }).start(this.options.imgOpacity);
                    }.bind(this));
                }.bind(this),
                
                mouseleave: function() {
                    a.get('tween', {
                        property: 'color',
                        duration: this.options.leaveDuration,
                        transition: this.options.leaveTransition,
                        link: 'cancel'
                    }).start(a.retrieve('defaultColor'));
                    a.getElements('img').each(function(img) {
                        img.get('tween', {
                            property: 'opacity',
                            duration: this.options.leaveDuration,
                            transition: this.options.leaveTransition,
                            link: 'cancel'
                        }).start(1);
                    }.bind(this));
                }.bind(this)
            });
        }.bind(this));
        
        new Fx.SmoothScroll({
            links: $$('a[href^=#]:not([href=#])'),
            wheelStops: false,
            duration: 'long',
            transition: 'expo:out'
        });
        
    }
});

/* 
    Fade In Class Effect 1.0.1
*/
var FadeInClassEffect = new Class({
    Implements: Options,
    options: {
        duration: 400,
        transition: 'expo:out',
        fadeInClassName: 'fade-in'
    },
    initialize: function(options) {
        this.setOptions(options);
                
        $$('.' + this.options.fadeInClassName).each(function(element) {
            element.setStyle('opacity', 0);
            element.getParent().addEvents({
                mouseenter: function() {
                    element.get('tween', {
                        property: 'opacity',
                        duration: this.options.duration,
                        transition: this.options.transition,
                        link: 'cancel'
                    }).start(1);
                }.bind(this),
                
                mouseleave: function() {
                    element.get('tween', {
                        property: 'opacity',
                        duration: this.options.duration,
                        transition: this.options.transition,
                        link: 'cancel'
                    }).start(0);
                }.bind(this)
            });
        }.bind(this));
        
    }
});

/*
    Fixed Grobal Navigation 1.0.0
*/
var FixedGrobalNav = new Class({
    Implements: Options,
    resizeTimer: null,
    scrollTimer: null,
    options: {
        wrapperIdName: 'wrapper',
        baseIdName: 'global-nav',
        fixedIdName: 'fixed-global-nav',
        duration: 200,
        transition: 'sine:in:out',
        opacity: 0.9
    },
    initialize: function(options) {
        this.setOptions(options);
        
        if (Browser.Engine.trident && Browser.Engine.version < 5) {
            $(this.options.fixedIdName).setStyle('display', 'none');
            return;
        }
        
        var fixedElement = $(this.options.fixedIdName);
        if ($defined(fixedElement) == false) {
            return;
        }
        
        fixedElement.store('defaultDisplay', fixedElement.getStyle('display'));
        fixedElement.addEvents({
            mouseenter: function() {
                fixedElement.get('tween', {
                    property: 'opacity',
                    duration: this.options.duration,
                    transition: this.options.transition,
                    link: 'chain'
                }).start(1);
            }.bind(this),
            
            mouseleave: function() {
                fixedElement.get('tween', {
                    property: 'opacity',
                    duration: this.options.duration,
                    transition: this.options.transition,
                    link: 'chain'
                }).start(this.options.opacity);
            }.bind(this)
        });
        fixedElement.setStyles({
            position: 'fixed',
            display: 'none',
            top: 0,
            opacity: this.options.opacity,
            'z-index': 99999999
        });
        
        this.toggle.run([], this);
        
        window.addEvents({
            scroll: function() {
                $clear(this.scrollTimer);
                this.scrollTimer = (function() {
                    this.toggle.run([], this);
                }.bind(this)).delay(200);
            }.bind(this),
            
            resize: function() {
                $clear(this.resizeTimer);
                this.resizeTimer = (function() {
                    this.toggle.run([], this);
                }.bind(this)).delay(200);
            }.bind(this)
        });
    },
    
    toggle: function() {
        var baseBottom = $(this.options.baseIdName).getCoordinates().bottom;
        var fixedElement = $(this.options.fixedIdName);
        fixedElement.setStyle('width', $(this.options.wrapperIdName).getComputedSize().totalWidth);
        
        if (window.getScroll().y > baseBottom) {
            if (fixedElement.getStyle('display') == 'none') {
                fixedElement.setStyle('display', fixedElement.retrieve('defaultDisplay'));
            }
            fixedElement.get('tween', {
                property: 'opacity',
                duration: this.options.duration,
                transition: this.options.transition,
                link: 'chain'
            }).start(this.options.opacity);
        } else {
            fixedElement.get('tween', {
                property: 'opacity',
                duration: this.options.duration,
                transition: this.options.transition,
                link: 'chain',
                onComplete: function() {
                    fixedElement.setStyle('display', 'none');
                }
            }).start(0);
        }
    }
});

/*
    Fixed Sidebar 1.0.0
*/
var FixedSidebar = new Class({
    Implements: Options,
    resizeTimer: null,
    scrollTimer: null,
    options: {
        wrapperIdName: null,
        sidebarIdName: 'sidebar',
        offsetX: 0,
        offsetY: 0,
        duration: 800,
        transition: 'expo:in:out'
    },
    initialize: function(options) {
        this.setOptions(options);
        
        var sidebar = $(this.options.sidebarIdName);
        if ($defined(sidebar) == false) {
            return;
        }
        
        sidebar.store('defaultTop', sidebar.getCoordinates().top);
        sidebar.store('defaultMarginTop', sidebar.getStyle('margin-top').toInt());
        
        this.adjust.run([], this);
        
        window.addEvents({
            scroll: function() {
                $clear(this.scrollTimer);
                this.scrollTimer = (function() {
                    this.adjust.run([], this);
                }.bind(this)).delay(600);
            }.bind(this),
            
            resize: function() {
                $clear(this.resizeTimer);
                this.resizeTimer = (function() {
                    this.adjust.run([], this);
                }.bind(this)).delay(200);
            }.bind(this)
        });
    },
    
    adjust: function() {
        var sidebar = $(this.options.sidebarIdName);
        var sidebarTop = sidebar.getCoordinates().top;
        var sidebarBottom = sidebar.getCoordinates().bottom;
        var top = window.getScrollTop();
        var bottom = top + window.getHeight();
        
        if (top - sidebarTop < 0 || top > sidebarBottom) {
            var posTop = top - sidebar.retrieve('defaultTop');
            if (posTop < 0) { 
                posTop = sidebar.retrieve('defaultMarginTop');
            } else {
                posTop += this.options.offsetX;
            }
            sidebar.get('tween', {
                property: 'margin-top',
                duration: this.options.duration,
                transition: this.options.transition,
                link: 'chain'
            }).start(posTop);
        }
    }
});

/*
    Slide Show 1.2.4
*/
var SlideShow = new Class({
	Implements: [Options,Events],
    slideElements: null,
    loadCount: 0,
    animationType: {
        fade: 0,
        slide: 1,
        hSlide: 2
    },
    options: {
        slideClassName: 'slide',
        slideAutoRotateClassName: 'slide-auto-rotate',
        slideAnimationType: 0,
        periodical: 5000,
        slideDuration: 500,
        slideTransition: 'expo:out',
        imgDuration: 500,
        imgTransition: 'expo:out',
        withThumbnail: true,
        imgDelay: 100,
        thumbDelay: 100,
		onComplete: $empty,
		onImgSizeChange: $empty
    },
    initialize: function(options) {
        this.setOptions(options);
    },
    
    run: function() {
        this.slideElements = $$('.' + this.options.slideClassName);

        if ($defined(this.slideElements)) {
            if (this.slideElements.length > 0) {
                this.slideElements.each(function(slide) {
                    var slideWrapper = new Element('div', { 'class': this.options.slideClassName + '-wrapper' });
                    slideWrapper.addClass('slide-wrapper');
                    slideWrapper.wraps(slide);
                    slide.store('slideWrapper', slideWrapper);
                    this.load.run([slide], this);
                }.bind(this));
            } else {
                this.fireEvent('complete');
            }
        }
    },
    
    load: function(self) {
        var slideWrapper = self.retrieve('slideWrapper');
        var imgs = self.getElements('img');
        
        if (imgs.length == 0) {
            this.checkLoadComplete.run([], this);
            return;
        } else {
            self.store('curImage', imgs[0])
        }
        
        if (imgs.length > 1 && self.hasClass(this.options.slideAutoRotateClassName)) {
            self.addEvents({
                mouseenter: function() {
                    this.stopRotate.run([self], this);
                }.bind(this),
                mouseleave: function() {
                    this.startRotate.run([self], this);
                }.bind(this)
            });
        }
        
        slideWrapper.setStyles({
            position: 'relative',
            overflow: 'hidden'
        });
        self.setStyles({
            position: 'relative',
            overflow: 'hidden',
            left: 0
        });
        
        this.setSlideSize(self, imgs);
                
        var thumbArea = null;
        if (imgs.length > 1) {
            thumbArea = new Element('div', { 'class': this.options.slideClassName + '-thumb-area' });
            thumbArea.addClass('slide-thumb-area');
            thumbArea.inject(slideWrapper, 'after');
        }
        
        var thumbItems = new Array();
        var srcs = new Array();
        imgs.each(function(img, imgIndex) {
        
            img.setStyle('opacity', 0);
            
            var thumbItem = null;
            if (imgs.length > 1) {
                thumbItem = new Element('span', {
                    'class': this.options.slideClassName + '-thumb-item',
                    styles: { opacity: 0 },
                    events: {
                        click: function() { 
                            this.rotate.run([self, img], this);
                        }.bind(this)
                    }
                });
                thumbItem.addClass('slide-thumb-item');
                if (imgIndex == 0) {
                    thumbItem.addClass('slide-thumb-item-focused');
                }
                
                if (self.hasClass(this.options.slideAutoRotateClassName)) {
                    thumbItem.addEvents({
                        mouseenter: function() {
                            this.stopRotate.run([self], this);
                        }.bind(this),
                        mouseleave: function() {
                            this.startRotate.run([self], this);
                        }.bind(this)
                    });
                }
                
                if (this.options.withThumbnail) {
                    var thumbImage = img.clone();
                    thumbImage.setStyle('opacity', 1)
                    thumbItem.grab(thumbImage);
                } else {
                    var thumbNo = new Element('span', { 
                        'class': this.options.slideClassName + '-thumb-no',
                        text: imgIndex + 1 
                    });
                    thumbNo.addClass('slide-thumb-no');
                    thumbItem.grab(thumbNo);
                }
                thumbItem.inject(thumbArea, 'bottom');
                thumbItems.push(thumbItem);
            }
            
            srcs.push(img.getProperty('src'));            
        }.bind(this));
        
        var myImages = new Asset.images(srcs, {
            onProgress: function(counter, index) {
                if (imgs.length > 1) {
                    
                    (function() { 
                        if (this.options.withThumbnail) {
                            thumbItems[index].tween('opacity', 1); 
                        } else {
                            thumbItems[index].setStyle('opacity', 1); 
                        }
                    }.bind(this)).delay(this.options.thumbDelay * index);
                    
                    var img = imgs[index];
                    imgWidth = img.getSize().x;
                    imgHeight = img.getSize().y;            
                    var nextLink = new Element('span', {
                        'class': this.options.slideClassName + '-next',
                        styles: { 
                            position: 'absolute',
                            'z-index': imgs.length,
                            width: (imgWidth / 2).toInt(),
                            height: imgHeight,
                            right: 0
                        },
                        events: {
                            click: function() {
                                this.next.run([self, img], this);
                            }.bind(this)
                        }
                    });
                    nextLink.addClass('slide-next');
                    var prevLink = new Element('span', {
                        'class': this.options.slideClassName + '-prev',
                        styles: { 
                            position: 'absolute',
                            'z-index': imgs.length,
                            width: (imgWidth / 2).toInt(),
                            height: imgHeight,
                            left: 0
                        },
                        events: {
                            click: function() {
                                this.prev.run([self, img], this);
                            }.bind(this)
                        }
                    });
                    prevLink.addClass('slide-prev');
                    
                    var imgWrapper = new Element('span', { 
                        'class': 'img-wrapper',
                        styles: { 
                            position: 'relative',
                            float: 'left',
                            'z-index': imgs.length - index,
                            opacity: 0
                        }
                    });
                    
                    imgWrapper.wraps(img);
                    imgWrapper.adopt(prevLink);
                    imgWrapper.adopt(nextLink);
                    img.store('imgWrapper', imgWrapper);
                    
                    (function() {
                        imgs[index].setStyle('opacity', 1);
                        imgs[index].retrieve('imgWrapper').get('tween', {
                            property: 'opacity',
                            duration: this.options.imgDuration,
                            transition: this.options.imgTransition,
                            link: 'cancel'
                        }).start(1);
                    }.bind(this)).delay(this.options.imgDelay * index);
                } else {
                    imgs[index].setStyle('opacity', 1);
                }
            }.bind(this),
            onComplete: function(){
                if (imgs.length > 1) {
                    if (self.hasClass(this.options.slideAutoRotateClassName)) {
                        this.startRotate.run([self], this);
                    }
                    this.setSlideSize(self, imgs);
                } else {
                    this.setSlideSize(self, imgs);
                    this.checkLoadComplete.run([], this);
                }
                if ($defined(thumbArea)) {
                    if (this.options.slideAnimationType == this.animationType.hSlide) {
                        thumbArea.setStyle('width', '100%');
                    } else {
                        thumbArea.setStyle('width', slideWrapper.getSize().x);
                    }
                }
            }.bind(this)
        });
        
        if (imgs.length > 1) {
            self.store('thumbItems', thumbItems);
            self.store('thumbArea', thumbArea);
        }
    },
    
    rotate: function(self, target) {
        var imgs = self.getElements('img');
        var curImage = self.retrieve('curImage');
        self.store('curImage', target);        
        var fireImgSizeChangeEvent = false;

        if (imgs.length > 1) {
            
            if ($defined(target)) {
                if (target == curImage) {
                    return;
                }
            } else {
                target = curImage;
            }

            var targetIndex = 0;
            for (var i = 0; i < imgs.length; i++) {
                if (imgs[i] == target) {
                    self.retrieve('thumbItems')[i].addClass('slide-thumb-item-focused');
                } else if (imgs[i] == curImage) {
                    self.retrieve('thumbItems')[i].removeClass('slide-thumb-item-focused');
                }
            }
            
            var imgWidth = target.getSize().x;
            var imgHeight = target.getSize().y;
            if (
                imgWidth != curImage.getSize().x || 
                imgHeight != curImage.getSize().y
            ) {
                fireImgSizeChangeEvent = true;
            }

            if (this.options.slideAnimationType == this.animationType.fade) {
                self.setStyles({
                    width: imgWidth,
                    height: imgHeight
                });
                
                var targetWrapper = target.retrieve('imgWrapper');
                var curImageWrapper = curImage.retrieve('imgWrapper');
                var zIndex = targetWrapper.getStyle('z-index').toInt();
                var curZIndex = curImageWrapper.getStyle('z-index').toInt();

                targetWrapper.setStyle('opacity', 0);
                if (zIndex < curZIndex) {
                    targetWrapper.setStyle('z-index', curZIndex + imgs.length);
                }
                
                targetWrapper.setStyles({
                    position: 'absolute',
                    top: 0,
                    left: 0
                });
                targetWrapper.store('isFading', true);
                targetWrapper.get('tween', {
                    property: 'opacity',
                    duration: this.options.imgDuration,
                    transition: this.options.imgTransition,
                    link: 'cancel',
                    onComplete: function() {
                        if (curImageWrapper.retrieve('isFading') == false) {
                            curImageWrapper.setStyle('top', imgHeight);
                        }
                        targetWrapper.store('isFading', false);
                    }
                }).start(1);
            } else if (
                this.options.slideAnimationType == this.animationType.slide ||
                this.options.slideAnimationType == this.animationType.hSlide
            ) {
                self.get('tween', {
                    property: 'left',
                    duration: this.options.slideDuration,
                    transition: this.options.slideTransition,
                    link: 'cancel'
                }).start(- target.getCoordinates(self).left);
            }
            
            var slideDuration = this.options.slideDuration;
            var slideWrapper = self.retrieve('slideWrapper');
            if (imgWidth == slideWrapper.getSize().x && imgHeight == slideWrapper.getSize().y) {
                slideDuration = 0;
            }
            
            if (
                this.options.slideAnimationType == this.animationType.fade ||
                this.options.slideAnimationType == this.animationType.slide
            ) {
                self.retrieve('thumbArea').get('tween', {
                    property: 'width',
                    duration: slideDuration,
                    transition: this.options.slideTransition,
                    link: 'chain'
                }).start(slideWrapper.getSize().x);
                slideWrapper.get('morph', {
                    duration: slideDuration,
                    transition: this.options.slideTransition,
                    link: 'chain',
                    onComplete: function() {
                        if (fireImgSizeChangeEvent) {
                            this.fireEvent('imgSizeChange');
                        }
                    }.bind(this)
                }).start({
                    width: imgWidth,
                    height: imgHeight
                });
            } else if (this.options.slideAnimationType == this.animationType.hSlide) {
                if (fireImgSizeChangeEvent) {
                    this.fireEvent('imgSizeChange');
                }
            }
        }    
    },
    
    next: function(self, img) {
        var imgs = self.getElements('img');
        var curImage = img || self.retrieve('curImage');
        var target = imgs[0];
        if ($defined(img) == false || img == self.retrieve('curImage')) {
            for (var i = 0; i < imgs.length; i++) {
                if (imgs[i] == curImage) {
                    if (imgs.length == i + 1) {
                        target = imgs[0];
                    } else {
                        target = imgs[i + 1];
                    }
                    break;
                }
            }
        } else {
            target = img;
        
        }
        this.rotate.run([self, target], this);
    },
    
    prev: function(self, img) {
        var imgs = self.getElements('img');
        var curImage = img || self.retrieve('curImage');
        var target = imgs[0];
        if ($defined(img) == false || img == self.retrieve('curImage')) {
            for (var i = 0; i < imgs.length; i++) {
                if (imgs[i] == curImage) {
                    if (i == 0) {
                        target = imgs.getLast();
                    } else {
                        target = imgs[i - 1];
                    }
                    break;
                }
            }
        } else {
            target = img;
        
        }
        this.rotate.run([self, target], this);
    },
    
    startRotate: function(self) {
        if ($defined(self.retrieve('timer')) == false) {
            var timer = (function() {
                this.next.run([self], this);
            }.bind(this)).periodical(this.options.periodical);
            self.store('timer', timer);
        }
    },
    
    stopRotate: function(self) {
        if ($defined(self.retrieve('timer'))) {
            $clear(self.retrieve('timer'));
            self.store('timer', null)
        }
    },
    
    checkLoadComplete: function() {
        this.loadCount++;
        if (this.loadCount == this.slideElements.length) {
            this.fireEvent('complete');
        }
    },
    
    setSlideSize: function(self, imgs) {
        var slideWrapper = self.retrieve('slideWrapper');
        var totalWidth = 0;
        var minHeight = 0;
        var maxHeight = 0;
        imgs.each(function(img, index) {
            totalWidth += img.getSize().x || img.getProperty('width').toInt();
            maxHeight = Math.max(maxHeight, img.getSize().y || img.getProperty('height').toInt());
            if (minHeight == 0) {
                minHeight = img.getProperty('height').toInt();
            } else {
                minHeight = Math.min(minHeight, img.getSize().y || img.getProperty('height').toInt());
            }
        }.bind(this));
        
        if (this.options.slideAnimationType == this.animationType.fade) {
            self.setStyles({
                width: imgs[0].getSize().x || imgs[0].getProperty('width').toInt(),
                height: imgs[0].getSize().y || imgs[0].getProperty('height').toInt() 
            });
            slideWrapper.setStyles({
                width: self.getSize().x,
                height: self.getSize().y
            });
        } else if(this.options.slideAnimationType == this.animationType.slide) {
            self.setStyles({
                width: totalWidth,
                height: maxHeight
            });
            slideWrapper.setStyles({
                width: imgs[0].getSize().x || imgs[0].getProperty('width').toInt(),
                height: imgs[0].getSize().y || imgs[0].getProperty('height').toInt()
            });
        } else if (this.options.slideAnimationType == this.animationType.hSlide) {
            self.setStyles({
                width: totalWidth,
                height: maxHeight
            });
            slideWrapper.setStyles({
                height: maxHeight
            });
        }
    }
    
});

/*
    ToolTips 1.0.0
*/
var ToolTips = new Class({
	Implements: [Options,Events],
    options: {
        tipDuration: 250,
        tipTransition: 'expo:out',
        tipOpacity: 0.9,
        tipMinWidth: 50,
        triangleLeft: 10,
        triangleWidth: 5,
        triangleHeight: 5,
        attachTipClassNames: []
    },
    initialize: function(options) {
        this.setOptions(options);
        
        this.options.attachTipClassNames.push('attach-tip');
        
        // Clear Anchor Title
        $$('a').each(function(a) {
            var classString = a.getProperty('class');
            var clearTitle = true;
            this.options.attachTipClassNames.each(function(attachTipClassName) {
                if (classString.contains(attachTipClassName)) {
                    clearTitle = false;
                }
            }.bind(this));
            if (clearTitle) {
                a.setProperty('title', '');
            }
        }.bind(this));
        
        var attachSelectors = new Array();
        this.options.attachTipClassNames.each(function(attachTipClassName) {
            attachSelectors.push('[class*=' + attachTipClassName + ']');
        }.bind(this));
        
        var tips = new Tips(attachSelectors, {
            showDelay: 0,
            hideDelay: 0,
            offset: {x: 0, y: 0},
            fixed: true
        });
        
        tips.addEvent('show', function(tip, el){
            tip.addClass('tip-animation');
            tip.setStyle('width', 'auto');
            var marginTop = el.getStyle('padding-top').toInt() - (tip.getComputedSize().totalHeight + this.options.triangleHeight * 2);
            tip.setStyles({
                width: Math.max(tip.getSize().x, this.options.tipMinWidth),
                'margin-top': marginTop + this.options.triangleHeight,
                'margin-left': el.getStyle('padding-left').toInt() - (this.options.triangleLeft + this.options.triangleWidth * 2),
                opacity: 0,
                'z-index': 999999
            });
            tip.get('morph', {
                duration: this.options.tipDuration,
                transition: this.options.tipTransition
            }).start({
                'margin-top': marginTop,
                opacity: this.options.tipOpacity
            });
        }.bind(this));
        
        tips.addEvent('hide', function(tip, el){
            tip.removeClass('tip-animation');
        }.bind(this));
        
    }
    
});

