/*! (C) 2008 PRIME Computer Kft. www.prime.hu */

// Buffer for progressbars
PSIntra.gl_progress  = [];
	
jQuery.extend({
	// Update progressbar
	// Input: Buffer pointer for progress
	psupdateprogress: function(ap)
	{
		// If no prgoress in buffer, then exit
		if( PSIntra.gl_progress[ap] === undefined ) return false;		
		var aprog = PSIntra.gl_progress[ap];
		
		// Clear timer handle
		aprog.timerhandle = -1;
		
		// If finished, nothing to do
		if( aprog.finished ) return false;
		
		// Check state if need...
		aprog.checkcounter++;
		if( aprog.checkcounter > aprog.checkevery )
		{
			if( aprog.onstatus != null )
			{
				var res = aprog.onstatus( aprog.progressid,ap);
				aprog.totalparts    = res.totalparts;
				aprog.finishedparts = res.finishedparts;
			}
			aprog.checkcounter = 1;
		}
		
		// Draw current status
		if( aprog.totalparts == 0 )
		{
			// Draw no-percent picture			
			aprog.innerstate++;
			if( aprog.innerstate > 50 ) aprog.innerstate = 0;
			aprog.progress.css( 'background-position', ( aprog.innerstate * 2 )+'% center' );
		}
		else
		{
			// Turn off stripes
			if( aprog.innerstate >= 0 )
			{
				aprog.progress.css('background-image', 'none' );
				aprog.innerstate = -1;
			}

			// Change border
			if( aprog.innerstate == -1 )
			{
				aprog.progress.css( 'border-color', aprog.altbordercol);
				aprog.innerstate = -2;
			}
			else
			{
				aprog.progress.css( 'border-color', aprog.bordercolor);
				aprog.innerstate = -1;
			}
			
			// Handle percentage values
			if( aprog.finishedparts < 0 ) aprog.finishedparts = 0;
			if(	aprog.finishedparts > aprog.totalparts ) aprog.finishedparts = aprog.totalparts;
			
			// Draw percent picture
			var innerdiv=aprog.progress.find(".progress");
			var w=Math.round(aprog.finishedparts/aprog.totalparts*100);
			innerdiv.css("width",w+"%");	
			aprog.progress.find(".text").html(w+" %");
			
			// Check finished
			aprog.finished = aprog.finishedparts == aprog.totalparts;
		}

		// If progress is finished
		if( aprog.finished )
		{	
			aprog.progress.css( 'border-color', aprog.bordercolor);
			if( aprog.finishtext != '' )
			{
				innerdiv.css("width","0%");	
				aprog.progress.find(".text").html(aprog.finishtext);
			}
			aprog.timerhandle = setTimeout( "$.psfinishprogress("+ap+");", 100 );
		}
		// Set timer for next check
		else
		{
			aprog.timerhandle = setTimeout( "$.psupdateprogress("+ap+");", aprog.qintervall );			
		}
		
		return false;
	},
	
	// Progress finished
	psfinishprogress: function(ap)
	{		
		if( PSIntra.gl_progress[ap] === undefined ) return false;
		var aprog = PSIntra.gl_progress[ap];
		
		aprog.timerhandle = -1;
		
		// Call finish event, if exists
		if( aprog.onfinish !== null )
		{
			aprog.onfinish( aprog.progressid, ap );
		}

		// Enable action button, if given
		if( aprog.actionbutton != '' ) 
		{
			$.endisbutton( $.formid( aprog.actionbutton ), '', true );
		}
		
		return false;
	},

	// Stop (abort) given / all progress
	psstopprogress: function(ap)
	{
		// If no param given, stop all progresses
		if( ap === undefined )
		{
			for( ap in PSIntra.gl_progress ) $.psstopprogress( ap );
			return false;
		}
		// If given, but invalid, nothing to do
		else if( PSIntra.gl_progress[ap] === undefined ) 
		{
			return false;
		}
		
		var aprog = PSIntra.gl_progress[ap];
		
		// If there is pending timer, stop it
		if( aprog.timerhandle >= 0 ) 
		{
			clearTimeout(aprog.timerhandle);
			aprog.timerhandle = -1;
		}		
		// Forced set 'finished'
		aprog.finished = true;
		
		// Set aborted visual state
		var innerdiv=aprog.progress.find(".progress");
		aprog.progress.css('background-image', 'none' );
		aprog.innerstate = -1;
		innerdiv.css("width","0%");	
		aprog.progress.find(".text").html(aprog.aborttext);
					
		return false;
	},
	
	// Get AJAX status from PSINTRA
	pspstatusrogress: function(aprog_id, ap)
	{	
		var pdata = { prog_id: aprog_id };
    $.addsid(pdata);
    pdata[PSIntra.prt_ajaxfunc]='getprogstatus';
    var prog_res = $.mygetbypost( 'ajaxgate.php', pdata, 'json' );
    var res = { 
				prog_id: 				prog_res.PROG_ID,
				proc_name: 			prog_res.PROCESS_NAME,
				init_msg: 			prog_res.INIT_MESSAGE,
				finish_msg: 		prog_res.FINISH_MESSAGE,
				totalparts: 		prog_res.TOTALPARTS,
				finishedparts: 	prog_res.FINISHEDPARTS,
				proc_start: 		prog_res.PROCESS_START,
				proc_end: 			prog_res.PROCESS_END
			};
	
		return res;		
	}
	
});

jQuery.fn.extend({
	
	// Setup / start progressbar
	psprogress: function( opt ) 
	{ 
		// Options data
		var opts=$.extend({
			progressid: 0,    							// Progress ID (for PSINTRA query)
			onstatus: $.pspstatusrogress,   // Status callback
			onfinish: null,   							// Finish callback
			qintervall: 500,  							// Query / refresh intervall
			checkevery: 1,									// Check state at every x. query			
			totalparts: 0,    							// Total parts
			finishedparts: 0, 							// Finished parts
			actionbutton: '',								// Selector for action button
			bordercolor: 'navy',						// Default border color
			altbordercol: 'red',						// Alternate border color
			// Bg. image url
			bgimgurl: 'java/images/progressback.gif', 
			// Wait text while totalparts are calculated
			waittext: 'Kérem várjon...',
			// Text when progress finished
			finishtext: 'A folyamat elkészült...',
			// Text when progress aborted
			aborttext: 'A folyamat megszakítva...'
			}, opt || {} );

		// Internal data
		opts.checkcounter = 0;  			    // Check counter
		opts.innerstate   = 0;			  		// inner state for 'no-percentage' picture
		opts.finished			= false;			  // Progress finished
		opts.progress     = jQuery(this); // Progress element itself
		opts.timerhandle  = -1;						// Handle for current timer
		
		// Disable action button, if given
		if( opts.actionbutton != '' ) 
		{
			$.endisbutton( $.formid( opts.actionbutton ), '', false );		
		}
		
		// Set up progress content
		var innerdiv=opts.progress.find(".progress"), ap = -1, pid = opts.progress.attr("id");
		
		// If this is the first setup
		if (innerdiv.length != 1)
		{		
			ap = PSIntra.gl_progress.length;
			innerdiv = $("<div class='progress'></div>");					
			opts.progress.append( "<div class='text'>&nbsp;</div>" );
			$("<span class='text'>&nbsp;</span>").css("width",opts.progress.width()).appendTo(innerdiv);					
			opts.progress.append(innerdiv);					
		}
		// Already used
		else
		{
			// Find in buffer
			for( var ep in PSIntra.gl_progress )
			{
				if( PSIntra.gl_progress[ep].progress.attr("id") == pid )
				{
					ap = ep;	
					break;
				}				
			}
			
			// Must be in array, but not found...
			if( ap < 0 ) return false;			
		}
		
		// Init progress
		innerdiv.css("width","0%");	
		opts.progress.find(".text").html(opts.waittext);
		opts.progress.css('background-image', 'url("'+opts.bgimgurl+'")' ).css( 'border-color', opts.bordercolor);
		
		// Save progress to buffer
		PSIntra.gl_progress[ap] = opts;
		
		// Call update
		PSIntra.gl_progress[ap].timerhandle = setTimeout( "$.psupdateprogress("+ap+");", 100 );			
	}
});

