/**
 *JQuery modal progress bar
 *@author Vladislav Karelkin
 */
//default parameters 
var progBarConst = new Object;
progBarConst.innerBarW = 136;
progBarConst.defTime = 5;
progBarConst.increment = 10;
progBarConst.percent = 99;
progBarConst.tPercent = 0;
progBarConst.speed = 20;
progBarConst.isFormEmb = true;
progBarConst.vailId = 'progressBarVail';
progBarConst.barId = 'progressBarBg';
progBarConst.whiteBarId = 'progressBarWite';
progBarConst.innerBarId = 'progressBarInner';
progBarConst.loadMsg = 'LOADING...';
progBarConst.interval = 0;
progBarConst.isRTL = false;

//run anonimous function to preserve $ sign
(function($) {
/*
* show or hide progress bar tags private function
*/
 progBarConst.toggleProgressBar = function(v){
    if(v == null){return;}
    $('#'+progBarConst.vailId).css('display', v);
    $('#'+progBarConst.barId).css('display', v);
    $('#'+progBarConst.whiteBarId).css('display', v);
    $('#'+progBarConst.innerBarId).css('display', v);   
}//toggleProgressBar

/*
*  show / hide attention seekers 
**/
 progBarConst.inViz = function (h){
    if(h == null){return;}
    $('select').css('visibility', h);
    $('iframe').css('visibility', h);
    $('object').css('visibility', h);
    $('embed').css('visibility', h);  
}//inViz

//gets browser safe document height   
 progBarConst.documentHeight = function() {
		if ($.browser.msie && typeof XMLHttpRequest == 'undefined') {
			var scrollHeight = Math.max(
				document.documentElement.scrollHeight,
				document.body.scrollHeight
			);
			var offsetHeight = Math.max(
				document.documentElement.offsetHeight,
				document.body.offsetHeight
			);
			
			if (scrollHeight < offsetHeight) {
				return $(window).height() ;
			} else {
				return scrollHeight ;
			}
		} else {
			return $(document).height();
		}
 }//documentHeight
 
	//gets browser safe document width
 progBarConst.documentWidth = function() {
		if ($.browser.msie && typeof XMLHttpRequest == 'undefined') {
			var scrollWidth = Math.max(
				document.documentElement.scrollWidth,
				document.body.scrollWidth
			);
			var offsetWidth = Math.max(
				document.documentElement.offsetWidth,
				document.body.offsetWidth
			);
			
			if (scrollWidth < offsetWidth) {
				return $(window).width() ;
			} else {
				return scrollWidth ;
			}
		} else {
			return $(document).width();
		}
	}//documentWidth
  
  //get 
  progBarConst.getCenter = function(){
    var operaFix = window.opera && (document.compatMode == "CSS1Compat") && ($.browser.version >= 9.3);
    var wnd = $(window), doc = $(document);
    var pTop = doc.scrollTop(), pLeft = doc.scrollLeft(), minTop = pTop;
    if(jQuery.browser.msie && typeof XMLHttpRequest == 'undefined'){
        pLeft += (wnd.width() - progBarConst.innerBarW ) / 2;
        pTop  += (wnd.height()) / 3;
    }else{
        pTop = Math.abs((operaFix ? document.documentElement.clientHeight : wnd.height()) / 3);
        pLeft = Math.abs( ((operaFix ? document.documentElement.clientWidth : wnd.width()) - progBarConst.innerBarW) / 2); 
    }
    pTop = Math.round(pTop);
    pLeft = Math.round(pLeft);
    pTop = pTop > 0 ? pTop : 0;
    pLeft = pLeft > 0 ? pLeft : 0;
    return {left: pLeft, top: pTop};
  }//getCenter  
  
  /** triggers progress bar
    *  @param [time] - optional
    */
    progBarConst.progressBar = function(time){
        if (time == null){
            time = progBarConst.defTime;
        }
        if(progBarConst.FnTimer != null){            
            return;
        }       
        var ab='absolute';
        var n='none';
        var h='hidden';    
        var b='block';
        var v='visible';
        var p = 'px';
        var vail = $('#'+progBarConst.vailId);
        var prBarBg = $('#'+progBarConst.barId);
        var objInnerBar = $('#'+progBarConst.innerBarId);
        var center = progBarConst.getCenter();
        var dH = progBarConst.documentHeight();
        var dW = progBarConst.documentWidth();
        var t = 0;
        var rtl = progBarConst.isRTL ? 1 : -1;
        
        if(vail == null || prBarBg == null || objInnerBar == null){
            window.alert("Progress bar is not initialized!");
            return;
        }
        if(progBarConst.loadMsg != ''){
              $(prBarBg).prepend(progBarConst.loadMsg);
              progBarConst.loadMsg = '';
        }
        //adjust location
        $(prBarBg).css({top: center.top + p, left: center.left + p});
        $(vail).css({left:0,top:0,width:dW+p,height:dH+p}); 
        progBarConst.toggleProgressBar(b);
        progBarConst.inViz(h);
        progBarConst.tPercent = 0;          
          
        t = window.setInterval( function (){
           //var objInnerBar = $('#'+progBarConst.innerBarId);           
           if(objInnerBar != null && time > 0){
               var pixels = (progBarConst.innerBarW) / 100  // Define how many pixels go into 1%
               var index = 0; //slow down progress bar exponentially after 70% complete
               if(progBarConst.tPercent > 90){
                  index = (progBarConst.tPercent)/time;
               }
               progBarConst.interval = t;
               var increment = (progBarConst.percent)/(time*1000/(progBarConst.speed) + (progBarConst.tPercent)*index);           
                  
               if((progBarConst.percent - progBarConst.increment) > progBarConst.tPercent){
                  progBarConst.tPercent = Math.min( progBarConst.tPercent + increment , progBarConst.percent - progBarConst.increment);                  
                  var width = Math.min((progBarConst.tPercent*pixels), progBarConst.innerBarW - pixels);                  
                  $(objInnerBar).css('backgroundPosition', rtl*(progBarConst.innerBarW - width) + "px top");                  
               }else{
                  progBarConst.interval = 0;
                  window.clearInterval(t);
               }         
           }//if
       }, progBarConst.speed);//setInterval
        
    }//progressBar
 
 /*
 * hides progress bar public function
*/
progBarConst.hideProgressBar = function(){
    if(progBarConst.interval != 0){      
      window.clearInterval(progBarConst.interval);
      progBarConst.interval = 0;      
    }
    progBarConst.tPercent = progBarConst.percent;
    if(typeof progBarConst.progressBar == 'function'){
        progBarConst.toggleProgressBar('none');    
        progBarConst.inViz('visible');
    }
      
      //reset global clicked variable from legacy code
    if(typeof clicked != 'undefined'){
        clicked = false;
    }
}//hideProgressBar



jQuery(function(){    
    var ab='absolute';
    var n='none';
    var h='hidden';    
    var b='block';
    var v='visible';
    var p = 'px';
    var wnd = $(window);
    var doc = $(document);
    var operaFix = window.opera && (document.compatMode == "CSS1Compat") && ($.browser.version >= 9.3);
    var dH = progBarConst.documentHeight();
    var dW = progBarConst.documentWidth();
    var pBTop = Math.abs((operaFix ? document.documentElement.clientHeight: wnd.height()) / 3);
    var pbLeft = Math.abs( ((operaFix ? document.documentElement.clientWidth:wnd.width()) - progBarConst.innerBarW) / 2);
    //add html  
    var vail = $('<div id="'+progBarConst.vailId+'"></div>').appendTo(document.body);    
    var prBarBg = $('<div id="'+progBarConst.barId+'"></div>').appendTo(document.body);
    var objWhiteBar = $('<div id="'+progBarConst.whiteBarId+'"></div>').appendTo(prBarBg);
    var objInnerBar = $('<div id="'+progBarConst.innerBarId+'"></div>').appendTo(objWhiteBar);
    //add CSS 
    $(vail).css({left:0,top:0,width:dW+p,height:dH+p,display:n,position:ab,'z-index':998});    
    $(prBarBg).css({display:n,position:ab,'z-index':999,top: pBTop + p,left: pbLeft + p});    
    $(objWhiteBar).css({display:n});    
    $(objInnerBar).css({display:n, width: progBarConst.innerBarW +p,backgroundPosition: 0-progBarConst.innerBarW + "px 50%"});
       
    //fix progress bar for old IE browsers
    if (jQuery.browser.msie &&  typeof XMLHttpRequest == 'undefined'){
        $(wnd).scroll(function(){
                if($(prBarBg).css('display') != n){
                    var pTop = doc.scrollTop(), pLeft = doc.scrollLeft(),
                        minTop = pTop;                    
                    pLeft += (wnd.width() - progBarConst.innerBarW ) / 2;
                    pTop  += (wnd.height()) / 3;
                    pTop = Math.max(pTop, minTop);
                    pTop = pTop > 0 ? pTop : 0;
                    pLeft = pLeft > 0 ? pLeft : 0;
                    $(prBarBg).css({top: pTop + p,left: pLeft + p});
                }
            
        });
    }    
    
    //fix position browser resize
    $(wnd).resize(function(){
        if($(prBarBg).css('display') != n){
           var  pTop = doc.scrollTop(),
                pLeft = doc.scrollLeft(), minTop = pTop;
                
            if(jQuery.browser.msie && typeof XMLHttpRequest == 'undefined'){
                pLeft += (wnd.width() - progBarConst.innerBarW ) / 2;
                pTop  += Math.round((wnd.height()) / 3);
                pTop = Math.max(pTop, minTop);
                var dH = progBarConst.documentHeight();
                var dW = progBarConst.documentWidth();
                $(vail).css({left:0,top:0,width:dW+p,height:dH+p}); 
            }else{
               pTop = Math.round((operaFix ? document.documentElement.clientHeight: wnd.height()) / 3);
               pLeft = Math.round( ((operaFix ? document.documentElement.clientWidth:wnd.width()) - progBarConst.innerBarW) / 2); 
            }
            pTop = pTop > 0 ? pTop : 0;
            pLeft = pLeft > 0 ? pLeft : 0;
            $(prBarBg).css({top: pTop + p,left: pLeft + p});       
        }              
    });
          
    //hide progress bar on double click
    $(vail).dblclick(function(){
        progBarConst.hideProgressBar(); 
        if(jQuery.browser.msie){           
            document.execCommand("Stop");
        }else{           
           window.stop(); 
        }        
    });
       
        
    //overrride internal submit function
    if(progBarConst.isFormEmb){         
        $('form:not(.noprogress)').each(function(){
         //overrride onsubmit event listenter
        $(this).submit(function(){            
            progBarConst.progressBar();
        });
        //override form.submit function
        this.proxiedSubmit = this.submit;        
        this.submit = function(){         
          progBarConst.progressBar();          
          return this.proxiedSubmit();          
        }
      });
    }//if(progBarConst 
    
 });//jQuery(function()

})(jQuery);

/** triggers progress bar public function
 *  param [time] - optional
*/
function progressBar(time){    
    if(typeof progBarConst.progressBar == 'function'){
        progBarConst.progressBar(time);
    }
    
}//progressBar

/*
 * hides progress bar public function
 * 
*/
function hideProgressBar(){
    if(typeof progBarConst.hideProgressBar == 'function'){
        progBarConst.hideProgressBar();
    }
}
