jQuery(document).ready(function($){
    
    parallax_box = $('section.parallax-box');
    if(parallax_box.length > 0){
        ParallaxBox();
    }
    
    function ParallaxBox()
    {
        var windowSelector = $(window),
            documentSelector = $(document),
            documentWidth = documentSelector.width(),
            windowHeight = windowSelector.outerHeight(),
            liteMode = false,
            ieVersion = getInternetExplorerVersion();
            
        var ds = document.documentElement;
            
        if(!device.mobile() && !device.tablet()){
			liteMode = false;
            
            if (ieVersion !=-1 && ieVersion < 9){
                liteMode = true;
            }
		}else{
			liteMode = true;
		}
        
        parallax_box.each(function()
        {
           parallaxBox($(this));
        });
        
        function parallaxBox(obj){
            
            var obj_bg = obj.find('.parallax-bg'),
                type = obj_bg.data('parallax-type'),
                obj_bg_inner,
                img,
                originalWidth = 0,
                originalHeight = 0,
                img_url = obj_bg.data('img-url'),
                bufferRatio = obj_bg.data('speed'),
                parallaxInvert = obj_bg.data('invert'),
                parallaxType = 'parallax_normal',
                objHeight = obj.height(),
                objOffsetTop = obj.offset().top,
                baseHeight = 0,
                parallax = true;
                notResize = false;
            
            switch (type) {
                case 'image':
                    loadImg(); 
                    
                    break
                    
                case 'video':
                    obj_bg_inner = $('.parallax_media', obj_bg);
                    
                    if(liteMode) {
                        obj_bg_inner.remove();
                        loadImg();   
                    } else {
                        loadVideo();
                    }
                    
                    break
            }
            
            function loadImg(){
                if(img_url){
                    img = new Image();
                    img.src = img_url;
                    
                    img.onload = function ()
                    {
                        originalWidth = img.width;
                        originalHeight = img.height;
                        
                        imgBlocksStructure = !liteMode ? "<div class='parallax-img parallax-bg-inner'></div>" : "<img class='parallax-img parallax-bg-inner' src='' alt=''/>";
                        obj_bg.append(imgBlocksStructure);
                        obj_bg_inner = $('.parallax-img', obj_bg);
                        
                        if(!liteMode){
                            obj_bg_inner.css('background-image', 'url(' + (img_url) + ')');
                        } else { 
                            obj_bg_inner.attr('src', img_url);
                            bufferRatio = 'none';
                        }
                        
                        initParallax();
                    }
                }
            }
            
            function loadVideo()
            {   
                var videoElement = obj_bg_inner.get(0);
                    
                videoElement.load();
                videoElement.play();
                
                originalWidth = videoElement.videoWidth;
                originalHeight = videoElement.videoHeight;
                    
                if(img_url){
                    img = new Image();
                    img.src = img_url;
                    
                    img.onload = function ()
                    {
                        originalWidth = originalWidth==0 ? img.width : originalWidth;
                        originalHeight = originalHeight==0 ? img.height : originalHeight;
                        objectResize(obj_bg_inner, documentWidth, baseHeight, originalWidth, originalHeight);
                    }
                }
                
                videoElement.onloadeddata = function()
                {
                    originalWidth = videoElement.videoWidth;
                    originalHeight = videoElement.videoHeight;
                    objectResize(obj_bg_inner, documentWidth, baseHeight, originalWidth, originalHeight);
                }
                
                initParallax();
            }
            
            function initParallax()
            {
                notResize = false;
                
                if(!parallaxInvert){
                    parallaxType = 'parallax_normal';
                } else {
                    parallaxType = 'parallax_invert';
                }
                
                switch (bufferRatio) {
                    case 'low':
                        bufferRatio = 3;
                        
                        break
                        
                    case 'normal':
                        bufferRatio = 2.25;
                        
                        break
                        
                    case 'hight':
                        bufferRatio = 1.5;
                        
                        break
                        
                    case 'fixed':
                        if(ieVersion != -1 || getSafari()){
                            if(type != 'video'){
                                parallax = false;
                                notResize = true;
                                obj_bg_inner.css({backgroundAttachment:'fixed', width:'100%', height:'100%'});
                            } else {
                                parallaxType = 'parallax_normal';
                                bufferRatio = 2.25;
                            }
                        } else {
                            parallaxType = 'parallax_fixes';
                            bufferRatio = 1;
                        }
                        
                        break
                        
                    case 'none':
                        parallax = false;
                        parallaxType = 'parallax_none';
                        
                        break
                        
                    default:
                        bufferRatio = 2.25;
                        
                        if(bufferRatio > 5) bufferRatio = 5; 
                        if(bufferRatio <= 1) {
                            if($.browser.msie){
                                parallax = false;
                                obj_bg_inner.css({backgroundAttachment:'fixed'});
                            } else {
                                parallaxType = 'parallax_fixes';
                                bufferRatio = 1;
                            }
                        }
                    
                        break
                }          
                
                windowSelector.resize(parallaxObjResize);
                parallaxObjResize();
                
                if(!liteMode) windowSelector.scroll(parallaxMove);
            }
            
            function parallaxObjResize()
            {
                documentWidth = documentSelector.width();
                windowHeight = windowSelector.outerHeight();
            
                objHeight = obj.height();
                
                obj_bg.width(documentWidth);
                obj_bg.css({'width' : documentWidth, 'margin-left' : Math.floor(documentWidth*-0.5), 'left' : '50%'});
                               
                if(!notResize){                
                    baseHeight = getBaseHeight(parallaxType, objHeight, bufferRatio);
                    objectResize(obj_bg_inner, documentWidth, baseHeight, originalWidth, originalHeight);
                }                
                
                if(!liteMode) parallaxMove();
            }
            function parallaxMove()
            {
                if(parallax && !liteMode){
                    
                     var documentScrollTop,
                         startScrollTop,
                         endScrollTop;
         
                     objOffsetTop = obj.offset().top;
                     documentScrollTop = documentSelector.scrollTop();
         
                     startScrollTop = documentScrollTop + windowHeight;
                     endScrollTop = documentScrollTop - objHeight;
         
                     if((startScrollTop > objOffsetTop) && (endScrollTop < objOffsetTop)){  
                         
                         y = documentScrollTop - objOffsetTop;
                         
                         if(!parallaxInvert) {
                             newPositionTop =  parseInt(y / bufferRatio);
                         } else {
                             newPositionTop = -parseInt(y / bufferRatio) - parseInt(windowHeight / bufferRatio)
                         }
        
                         obj_bg_inner.css({ top: newPositionTop + 'px' });  
                     }
                 } 
            }
        }
        
        function objectResize(obj, baseWidth, baseHeight, originalWidth, originalHeight )
        {
            var imageRatio,
                originalWidth,
                originalHeight,
                newImgWidth,
                newImgHeight,
                newImgTop,
                newImgLeft;
    
            imageRatio = originalHeight/originalWidth;
            containerRatio = baseHeight/baseWidth;
    
            if(containerRatio > imageRatio){
                newImgHeight = baseHeight;
                newImgWidth = Math.round( (newImgHeight*originalWidth) / originalHeight );   
            }else{
                newImgWidth = baseWidth;
                newImgHeight = Math.round( (newImgWidth*originalHeight) / originalWidth );
            }
    
            newImgLeft=-(newImgWidth-baseWidth)*.5;
            newImgTop= -(newImgHeight-baseHeight)*.5;
            
            obj.css({width: newImgWidth, height: newImgHeight, marginTop: newImgTop, marginLeft: newImgLeft});
        }
        
        function getBaseHeight(parallaxType, objHeight, bufferRatio)
        {
            var newBaseHeight = 0;
            
            switch (parallaxType) {
                case 'parallax_normal':
                    newBaseHeight = objHeight + parseInt((windowHeight - objHeight)/bufferRatio);             
                    break
                    
                case 'parallax_invert':
                    newBaseHeight = objHeight + parseInt((windowHeight + objHeight)/bufferRatio);
                    break
                    
                case 'parallax_fixes':
                    newBaseHeight = windowHeight;
                    break
                    
                case 'parallax_none':
                    newBaseHeight = objHeight;
                    break
            }
            
            return newBaseHeight;
        }
        
        function getInternetExplorerVersion()
        {                        
            var rv = -1;
            if (navigator.appName == 'Microsoft Internet Explorer')
            {
                var ua = navigator.userAgent;
                var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
                if (re.exec(ua) != null)
                    rv = parseFloat( RegExp.$1 );
            }
            else if (navigator.appName == 'Netscape')
            {
                var ua = navigator.userAgent;
                var re  = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
                                
                if (re.exec(ua) != null)
                    rv = parseFloat( RegExp.$1 );                                      
            }
            
            return rv;
        }
        function getSafari(){
            var safari = false;
            if (navigator.userAgent.search("Safari") >= 0 && navigator.userAgent.search("Chrome") < 0) safari = true;
            return  safari;       
        }
    }
    
});