/**
 * UploadProgressMeter.js - Upload progress Meter javascript code
 *
 * Copyright (C) 2005  Joshua Eichorn  This program is free software; you can
 * redistribute it and/or modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.  This program is
 * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 *
 * @author       Joshua Eichorn <josh@bluga.net>
 * @copyright    Joshua Eichorn (c)2005
 * @link         http://bluga.net/projects/upload_progress_meter
 * @version      0.1
 */

/**
 * Global list of ids that were updating progress for
 */
var UploadProgressMeter_list = new Object();

/**
 * List of Currently Active ids
 */
var UploadProgressMeter_active = new Object();

/**
 * Currently Active count
 */
var UploadProgressMeter_count = 0;

/**
 * Update interval for progress bars
 */
var UploadProgressMeter_interval = 2000;

/**
 * ID of the current interval
 */
var UploadProgressMeter_intervalId = false;

/**
 * Remote proxy object
 */
var UploadProgressMeter_remote = false;

/**
 * Does the server return status information
 */
var UploadProgressMeter_status = true;

var uploads_in_progress = 0;
var sids = {};

function beginUpload(ul, sid) 
{		
	sids[ul.name] = sid;
	uploads_in_progress = uploads_in_progress + 1;
	var pb = $(ul.name + "_progress");
	Element.show(pb.parentNode);

	new Ajax.PeriodicalUpdater(
							{},
								'updater_picture_upload.php',
							{
								'decay': 0.1,
								'frequency' : 0.1, 
								'method': 'post', 
								'parameters': 'sid=' + sid,
								'onSuccess' : function(request){updateProgress(pb,request)},
								'onFailure' : function(request){updateFailure(pb,request)}
							})
	ul.form.submit();
}

function updateProgress(pb,req) 
{
	var percent = parseInt(req.responseText);
	if(!percent) percent = 0;
	pb.style.width = percent + "%";
	if(percent >= 100) 
	{
		var inp_id = pb.id.replace("_progress","");
		if(sids[inp_id]) 
		{
			uploads_in_progress = uploads_in_progress - 1;
			var inp = $(inp_id);
			if(inp) 
			{
				inp.value = sids[inp_id];
			}
		}

		Element.hide(pb.parentNode);
		sids[inp_id] = false;
	}
}

function updateFailure(pb,req) 
{
	var mes = req.responseText;
	alert(mes);
	pb.style.width=0;
	alert(mes);
	uploads_in_progress = uploads_in_progress - 1;
}

function submitUpload(frm) 
{
	if(uploads_in_progress > 0) 
	{
		alert("File upload in progress. Please wait until upload finishes and try again.");
	} 
	else 
	{
		frm.submit();
	}
}


/**
 * Handling starting up all progress bars when a form submits
 */
function UploadProgressMeter_Start(form, form_progress)
{
	// get an array of all the ids that need to be started, were only looking in the current form
	
	var idsToStart = new Array();

	var divs = form.getElementsByTagName('div');

	for(var i = 0; i < divs.length; i++) 
	{
		var id = divs[i].id;
		if ( id=='change_picture_progress' ) 
		{
			UploadProgressMeter_count++;
			UploadProgressMeter_active[id] = id;
			UploadProgressMeter_EnableProgress(id);
		}
	}

	if (!UploadProgressMeter_intervalId) 
	{
		if (UploadProgressMeter_status) 
		{
			UploadProgressMeter_intervalId = setInterval(UploadProgressMeter_Update,UploadProgressMeter_interval);
		}
		else 
		{
			UploadProgressMeter_intervalId = setInterval(UploadProgressMeter_Update,200);
		}
	}

	$(form_progress).style.display = 'inline';
	//Element.show(form_progress);
	UploadProgressMeter_Update();
}

/**
 * Register a file input by id
 */
function UploadProgressMeter_Register(progressId,identifier) 
{
	UploadProgressMeter_list[progressId] = identifier;
}

/**
 * Shows a progress bar and sets it to 0
 */
function UploadProgressMeter_EnableProgress(progress_id) 
{
	var progress = document.getElementById(progress_id);
	progress.style.display = 'block';
	/*
	progress.percent = 0;
	progress.start = 0;
	progress.direction = 1;
	progress.message = "Connecting";
	*/
	progress.update = function() { 
		this.getFirstDivByClass('bar').style.left = this.start+'%';
		this.getFirstDivByClass('bar').style.width = this.percent+'%'; 
		this.getFirstDivByClass('message').innerHTML = this.message; 
	}

	progress.getFirstDivByClass = function(className) {
		var nodes = this.getElementsByTagName('div');
		for(var i = 0; i < nodes.length; i++) {
			if (nodes[i].className == className) {
				return nodes[i];
			}
		}
	}

	progress.update();
}

/**
 * Update the progress bars of all the current bars
 */
function UploadProgressMeter_Update() 
{

	if (UploadProgressMeter_count <= 0) 
	{
		clearInterval(UploadProgressMeter_intervalId);
		UploadProgressMeter_intervalId = false;
		return;
	}

	if (!UploadProgressMeter_status) 
	{
		for(var i in UploadProgressMeter_active) 
		{
			var el = document.getElementById(i);
			el.percent = 10;
			if (el.start == 90) {
				el.direction = -1;
			}
			if (el.start == 0) {
				el.direction = 1;
			}

			if (el.direction == 1) {
				el.start += 10;
			}
			else {
				el.start -= 10;
			}
			el.update();
		}
		return;
	}

	if (UploadProgressMeter_remote == false) 
	{
		var callback = {
			getStatus: function(result) {
				for(var prop in result) {
					if (prop != "toString") {
						try {
							var el = document.getElementById(prop);
						} catch(e) {
							continue;
						}
						if (!el) {
							continue;
						}
						document.getElementById(prop).percent = result[prop].percent;
						document.getElementById(prop).message = result[prop].message;
						document.getElementById(prop).update();
						if (result[prop].noStatus) {
							UploadProgressMeter_status = false;
							if (UploadProgressMeter_intervalId) {
								clearInterval(UploadProgressMeter_intervalId);
								UploadProgressMeter_intervalId = setInterval(UploadProgressMeter_Update,200);
							}
						}

						if (document.getElementById(prop).percent == 100) {
							UploadProgressMeter_count--;
							delete UploadProgressMeter_active[prop];
						}
					}
				}
			}
		}
		UploadProgressMeter_remote = new UploadProgressMeterStatus(callback);
	}
	UploadProgressMeter_remote.getStatus(UploadProgressMeter_active);
}

window.uploadComplete = function(progressDiv, resultDiv, message, status) 
{
	Element.hide(progressDiv);

	if (status != 'ok')
	{
		$(resultDiv).style.color = 'red';
		Element.show(resultDiv);

		$(resultDiv).innerHTML = message;

		Effect.Pulsate(resultDiv, {duration:2, delay:2, queue: 'front'});
		Effect.Fade(resultDiv, {duration:1, delay:2, queue: 'front'});
	}
	else // (status == 'ok')
	{
		switch_div('change_photo_div');
		updateWidget('wgt_photo');
	}
	
	//$(resultDiv).innerHTML = '';
	$('user_picture').clear();

	UploadProgressMeter_count--;
	delete UploadProgressMeter_active[progressDiv];
		
	/*
	document.getElementById(id).start = 0;
	document.getElementById(id).percent = 100;
	document.getElementById(id).message = message;
	document.getElementById(id).update();
	*/
}

/*
HTML_AJAX.onError = function(err) {
	document.getElementById('debug').innerHTML += HTML_AJAX_Util.varDump(err);
}
*/