/* MODAL BEGIN */

function modal_create (caption, options) {

	this.options = $merge({
		height : '380px',
		width : '460px',
		content : '',
		ajax : false,
		buttons : [
		{
			icon : 'formaccept',
			text : 'Ok'
		},
		{
			icon : 'formcancel',
			text : 'Cancel'
		}
		]
	}, options);

	var modal_container = new Element('div').setProperty('class', 'modal-container').setStyles({
		height : this.options.height,
		width : this.options.width
	});

	if (this.options.ajax == true) {

		var margin_top = ((this.options.height.toInt() - 106) / 2);
		var margin_left = ((this.options.width.toInt() - 16) / 2);

		modal_container.adopt(new Element('div').setProperty('class', 'caption').setHTML(caption)).adopt(new Element('div').setProperty('id', 'modal_content').adopt(new Element('img').setProperty('src', 'images/ajax_loader_modal.gif').setStyles({
			'margin-top' : margin_top + 'px',
			'margin-left' : margin_left + 'px'
		})));

	} else {
		modal_container.adopt(new Element('div').setProperty('class', 'caption').setHTML(caption)).adopt(new Element('div').setProperty('id', 'modal_content').setHTML(this.options.content));
	}

	if (this.options.buttons.length > 0) {
		var tool_bar = new Element('ul').addClass('toolbar').setStyles({
			'float' : 'right',
			'margin' : '10px 12px'
		});

		this.options.buttons.each( function (button) {
			new Element('li').adopt(new Element('a').addClass('closeSticky').addClass(button.icon || 'formcancel').addEvent('click', button.onClick || Class.empty).adopt(new Element('span').appendText(button.text))).injectInside(tool_bar);
		});

		modal_container.adopt(new Element('div').setProperty('class', 'footer').setStyle('width', this.options.width).adopt(new Element('div')).adopt(tool_bar));
	} else {
		new Element('li').adopt(new Element('a').addClass('closeSticky').addClass('formcancel').adopt(new Element('span').appendText('Close'))).injectInside(tool_bar);
		modal_container.adopt(new Element('div').setProperty('class', 'footer').setStyle('width', this.options.width).adopt(new Element('div')).adopt(new Element('div').setHTML('')));
	}

	return modal_container;
}

function modal_alert (alert, options) {
	this.options = $merge({
		height : '140px',
		width : '400px'
	}, options);

	var content = '<div style="font-weight: bold; padding-top: 20px; text-align: center;">'+ alert +'</div>';
	var modal_container = new Element('div').setProperty('class', 'modal-container').setStyles({
		height : this.options.height,
		width : this.options.width
	});

	modal_container.adopt(new Element('div').setProperty('class', 'caption').setHTML('Alert')).adopt(new Element('div').setProperty('id', 'modal_content').setStyles({
		'text-align' : 'center'
	}).setHTML(content));

	var tool_bar = new Element('ul').addClass('toolbar').setProperty('id', 'modal_alert_toolbar');
	new Element('li').adopt(new Element('a').addClass('closeSticky').addEvent('click', this.options.onClose || Class.empty).appendText('OK')).injectInside(tool_bar);

	var padding_left = ((this.options.width.toInt() - 32) / 2);
	modal_container.adopt(new Element('div').setProperty('class', 'footer').setStyles({
		'padding-bottom' : '4px',
		'padding-left' : padding_left + 'px',
		width : this.options.width.toInt() - padding_left + 'px'
	}).adopt(new Element('div').setStyle('margin-bottom', '4px')).adopt(tool_bar));

	modalWindow = new StickyWinModal({
		allowMultiple: false,
		content: modal_container,
		modalOptions: {
			hideOnClick: false
		}
	});
}

function modal_confirm (question, onAccept) {

	var content = '<div style="font-weight: bold; padding-top: 20px; text-align: center;">'+ question +'</div>';
	return modal_create('Confirm', {
		height : '140px',
		width : '400px',
		content : content,
		ajax : false,
		buttons : [
		{
			icon : 'formaccept',
			text : 'OK',
			onClick : onAccept
		},
		{
			icon : 'formcancel',
			text : 'Cancel'
		}
		]
	});
}

/* MODAL END */

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

/* POPUP BEGIN */

function S4 () {
	return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}

function popUpAForm (page, id, width, height, disabled) {
	if ($defined(disabled)) {
		popUpAWindow('core.php?page=' + page + '&id=' + id + '&disabled=1', '', width, height);
	} else {
		popUpAWindow('core.php?page=' + page + '&id=' + id, '', width, height);
	}
}

function popUpAWindow(url, name, width, height, properties)
{
	if (!properties) { properties = ',resizable, status=0, toolbar=0, scrollbars=0, modal=0' }
	var wLeft = (screen.width - width) / 2
	var wTop = (screen.height - height) / 2

	name = (S4()+S4()+S4()).toUpperCase();
	var evalThis = 'winObj = window.open("' + url + '", "' + name + '", "width=' + width + ', height=' + height + ', left=' + wLeft + ', top=' + wTop + ', screenX=' + wLeft + ', screenY=' + wTop +  properties + '")'
	eval(evalThis);

	if (!winObj) {
		modal_alert('Please allow popups from this website.');
	} else {
		winObj.focus();
	}
}

/* POPUP END */

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

function shift_value (field, value) {
	if ($(field).getValue() == '') {
		$(field).value = value;
	}
}

/* TRACKS BEGIN */

function tracks_delete () {

	tracks = table_selected_return();
	if (tracks.length > 0) {
		question = (tracks.length == 1) ? 'This will delete the track' : 'This will delete '+ tracks.length +' tracks';
		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content : modal_confirm(question, function () {
				tracks.each( function (id) {
					$('table_row_' + id).remove();
				});

				fdTableSort.init('table');
				$('paginateList-table').remove();
				tablePaginater.init();

				xajax_tracksInterface('delete', tracks);
			}),
			modalOptions : {
				hideOnClick: false
			}
		});
	} else {
		modal_alert('No tracks selected');
	}
}

function tracks_validate (id) {
	
	if (id > 0) {
		question = 'This will validate the track';
		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content : modal_confirm(question, function () {
				$('table_row_' + id).remove();
				
				fdTableSort.init('table');
				$('paginateList-table').remove();
				tablePaginater.init();
				var tracks = new Array();
				tracks[0] = id;

				xajax_tracksInterface('validate', tracks);
			}),
			modalOptions : {
				hideOnClick: false
			}
		});		

	} else {

		tracks = table_selected_return();
		if (tracks.length > 0) {
			question = (tracks.length == 1) ? 'This will validate the track' : 'This will validate '+ tracks.length +' tracks';
			modalWindow = new StickyWinModal({
				allowMultiple: false,
				content : modal_confirm(question, function () {
					tracks.each( function (id) {
						$('table_row_' + id).remove();
					});
	
					fdTableSort.init('table');
					$('paginateList-table').remove();
					tablePaginater.init();
	
					xajax_tracksInterface('validate', tracks);
				}),
				modalOptions : {
					hideOnClick: false
				}
			});
		} else {
			modal_alert('No tracks selected');
		}
	}
}

function tracks_koda () {

	tracks = table_selected_return();
	if (tracks.length > 0) {
		question = (tracks.length == 1) ? 'This will register the track' : 'This will register '+ tracks.length +' tracks';
		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content : modal_confirm(question, function () {
				tracks.each( function (id) {
					$('table_row_' + id).remove();
				});

				fdTableSort.init('table');
				$('paginateList-table').remove();
				tablePaginater.init();

				xajax_tracksInterface('koda', tracks);
			}),
			modalOptions : {
				hideOnClick: false
			}
		});
	} else {
		modal_alert('No tracks selected');
	}
	
}

function tracks_add_folders () {

	tracks = table_selected_return();
	if (tracks.length > 0) {

		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content: modal_create('Add '+ tracks.length +' tracks to folder', {
				height : '320px',
				width : '400px',
				ajax : true,
				buttons : [
				{
					icon : 'formaccept',
					text : 'Ok',
					onClick : function () {
						
						if ($('folders_name').getValue()) {
			
							var values = new Array();
							values['tracks'] = tracks;
							values['folders_id'] = 0;
							values['folders_name'] = $('folders_name').getValue();

							xajax_foldersInterface('add_action', values);
						
						} else if ($('folders_id').getValue()) {

							var values = new Array();
							values['tracks'] = tracks;
							values['folders_id'] = $('folders_id').getValue();
							values['folders_name'] = '';

							xajax_foldersInterface('add_action', values);							
						
						} else {
							// VOID()
						}
					}
				},
				{
					icon : 'formcancel',
					text : 'Cancel'
				}
				]				
			}),
			modalOptions: {
				hideOnClick: false
			}
		});
	
		var values = new Array();
		values['tracks'] = tracks;

		xajax_foldersInterface('add_gui', values);
	} else {
		modal_alert('No tracks selected');
	}
}

function tracks_add_composers () {

	tracks = table_selected_return();
	if (tracks.length > 0) {

		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content: modal_create('Connect '+ tracks.length +' tracks to composer', {
				height : '320px',
				width : '400px',
				ajax : true,
				buttons : [
				{
					icon : 'formaccept',
					text : 'Connect',
					onClick : function () {
						
						if ($('composers_id').getValue()) {

							var values = new Array();
							values['tracks'] = tracks;
							values['composers_id'] = $('composers_id').getValue();

							xajax_composersInterface('add_action', values);							
						
						} else {
							// VOID()
						}
					}
				},
				{
					icon : 'formcancel',
					text : 'Cancel'
				}
				]				
			}),
			modalOptions: {
				hideOnClick: false
			}
		});
	
		var values = new Array();
		values['tracks'] = tracks;

		xajax_composersInterface('add_gui', values);
	} else {
		modal_alert('No tracks selected');
	}
}

function tracks_email () {

	tracks = table_selected_return();
	if (tracks.length > 0) {

		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content: modal_create('E-mail '+ tracks.length +' tracks', {
				height : '400px',
				width : '480px',
				content : '<div style="padding: 10px;"><table><tr><td>Recipient</td><td style="width: 10px;">&nbsp;</td><td><input type="text" id="email_recipient" value="" style="width: 387px;" /></td></tr><tr><td colspan="3" style="height: 10px;">&nbsp;</td></tr><tr><td>Subject</td><td style="width: 10px;">&nbsp;</td><td><input type="text" id="email_subject" value="" style="width: 387px;" /></td></tr><tr><td colspan="3" style="height: 10px;">&nbsp;</td></tr><tr><td colspan="3"><textarea id="email_content" style="height: 210px; width: 446px;"></textarea></td></tr></table></div>',
				buttons : [
				{
					icon : 'sendemail',
					text : 'Send',
					onClick : function () {
						var values = new Array();
						values['tracks'] = tracks;
						
						values['email_recipient'] = $('email_recipient').getValue();
						values['email_subject'] = $('email_subject').getValue();
						values['email_content'] = tinyMCE.getContent('email_content');
						
						tinyMCE.execCommand('mceFocus', false, 'email_content');                    
						tinyMCE.execCommand('mceRemoveControl', false, 'email_content');
						xajax_tracksInterface('email', values);

						(function(){tracks_email_wait()}).delay(200);
					}
				},
				{
					icon : 'formcancel',
					text : 'Cancel',
					onClick : function () {
						tinyMCE.execCommand('mceFocus', false, 'email_content');                    
						tinyMCE.execCommand('mceRemoveControl', false, 'email_content');
					}
				}
				]
			}),
			modalOptions: {
				hideOnClick: false
			}
		});

		tinyMCE.execCommand('mceAddControl', false, 'email_content');
	
	} else {
		modal_alert('No tracks selected');
	}
}

function tracks_email_wait () {
	modalWindow = new StickyWinModal({
		allowMultiple: false,
		content: '<div style="background: #fff; border: 1px solid #000; height: 100px; padding-top: 80px; text-align: center; width: 400px;">Sending e-mail - please wait<br /><img src="images/ajax_loader.gif" alt="" /></div>',
		modalOptions: {
			hideOnClick: false
		}
	});	
}

function tracks_export_selected () {
	tracks = table_selected_return();
	if (tracks.length > 0) {
		var values = new Array();
							
		values['id'] = tracks;
		xajax_tracksInterface('excel', values);
	} else {
		modal_alert('No tracks selected');
	}	
}

function tracks_export_list () {
	var values = new Array();
						
	values['id'] = 'List';
	xajax_tracksInterface('excel', values);	
}

function tracks_export_all () {
	var values = new Array();
						
	values['id'] = 'All';
	xajax_tracksInterface('excel', values);
}

/* TRACKS END */

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

/* COMPOSERS BEGIN */

function composertracks_delete () {

	tracks = table_selected_return();
	if (tracks.length > 0) {
		question = (tracks.length == 1) ? 'This will delete the track' : 'This will delete '+ tracks.length +' tracks';
		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content : modal_confirm(question, function () {
				tracks.each( function (id) {
					if ($('table_row_' + id).hasClass('delete')) {
						$('table_row_' + id).remove();
					}
				});

				$$('.table_select').each( function (el, i) {
					el.setProperty('checked', false);
				});

				fdTableSort.init('table');
				$('paginateList-table').remove();
				tablePaginater.init();

				xajax_composertracksInterface('delete', tracks);
			}),
			modalOptions : {
				hideOnClick: false
			}
		});
	} else {
		modal_alert('No tracks selected');
	}
}

function composertracks_email () {

	tracks = table_selected_return();
	if (tracks.length > 0) {

		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content: modal_create('E-mail '+ tracks.length +' tracks', {
				height : '400px',
				width : '480px',
				content : '<div style="padding: 10px;"><table><tr><td>Recipient</td><td style="width: 10px;">&nbsp;</td><td><input type="text" id="email_recipient" value="" style="width: 387px;" /></td></tr><tr><td colspan="3" style="height: 10px;">&nbsp;</td></tr><tr><td>Subject</td><td style="width: 10px;">&nbsp;</td><td><input type="text" id="email_subject" value="" style="width: 387px;" /></td></tr><tr><td colspan="3" style="height: 10px;">&nbsp;</td></tr><tr><td colspan="3"><textarea id="email_content" style="height: 210px; width: 446px;"></textarea></td></tr></table></div>',
				buttons : [
				{
					icon : 'sendemail',
					text : 'Send',
					onClick : function () {
						var values = new Array();
						values['tracks'] = tracks;
						
						values['email_recipient'] = $('email_recipient').getValue();
						values['email_subject'] = $('email_subject').getValue();
						values['email_content'] = tinyMCE.getContent('email_content');
						
						tinyMCE.execCommand('mceFocus', false, 'email_content');                    
						tinyMCE.execCommand('mceRemoveControl', false, 'email_content');
						xajax_composertracksInterface('email', values);

						(function(){tracks_email_wait()}).delay(200);
					}
				},
				{
					icon : 'formcancel',
					text : 'Cancel',
					onClick : function () {
						tinyMCE.execCommand('mceFocus', false, 'email_content');                    
						tinyMCE.execCommand('mceRemoveControl', false, 'email_content');
					}
				}
				]
			}),
			modalOptions: {
				hideOnClick: false
			}
		});

		tinyMCE.execCommand('mceAddControl', false, 'email_content');
	
	} else {
		modal_alert('No tracks selected');
	}
}

function composers_delete () {

	composers = table_selected_return();
	if (composers.length > 0) {
		question = (composers.length == 1) ? 'This will delete the composer' : 'This will delete '+ composers.length +' composers';
		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content : modal_confirm(question, function () {
				composers.each( function (id) {
					$('table_row_' + id).remove();
				});

				fdTableSort.init('table');
				$('paginateList-table').remove();
				tablePaginater.init();

				xajax_composersInterface('delete', composers);
			}),
			modalOptions : {
				hideOnClick: false
			}
		});
	} else {
		modal_alert('No composers selected');
	}
}

/* COMPOSERS END */

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

/* BANDS BEGIN */

function bands_delete () {

	bands = table_selected_return();
	if (bands.length > 0) {
		question = (bands.length == 1) ? 'This will delete the band' : 'This will delete '+ bands.length +' bands';
		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content : modal_confirm(question, function () {
				bands.each( function (id) {
					$('table_row_' + id).remove();
				});

				fdTableSort.init('table');
				$('paginateList-table').remove();
				tablePaginater.init();

				xajax_bandsInterface('delete', bands);
			}),
			modalOptions : {
				hideOnClick: false
			}
		});
	} else {
		modal_alert('No bands selected');
	}
}

/* BANDS END */

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

/* FOLDERS BEGIN */

function folders_delete () {

	folders = table_selected_return();
	if (folders.length > 0) {
		question = (folders.length == 1) ? 'This will delete the folder' : 'This will delete '+ folders.length +' folders';
		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content : modal_confirm(question, function () {
				folders.each( function (id) {
					$('table_row_' + id).remove();
				});

				fdTableSort.init('table');
				$('paginateList-table').remove();
				tablePaginater.init();

				xajax_foldersInterface('delete', folders);
			}),
			modalOptions : {
				hideOnClick: false
			}
		});
	} else {
		modal_alert('No folders selected');
	}
}

function folders_permissions (folders_id) {
	popUpAWindow('folders.permissions.core.php?folders_id='+ folders_id +'', '', 500, 600);
}

function folders_tracks_remove (folders_id, tracks_id) {

	$('table_row_folders_tracks_'+ tracks_id +'').remove();
	fdTableSort.init('folders_tracks_table');

	var values = new Array();
	values['folders_id'] = folders_id;
	values['tracks_id'] = tracks_id;

	xajax_foldersInterface('remove', values);
}

/* FOLDERS END */

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

/* USERS BEGIN */

function users_delete () {

	users = table_selected_return();
	if (users.length > 0) {
		question = (users.length == 1) ? 'This will delete the user' : 'This will delete '+ users.length +' users';
		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content : modal_confirm(question, function () {
				users.each( function (id) {
					$('table_row_' + id).remove();
				});

				fdTableSort.init('table');
				$('paginateList-table').remove();
				tablePaginater.init();

				xajax_usersInterface('delete', users);
			}),
			modalOptions : {
				hideOnClick: false
			}
		});
	} else {
		modal_alert('No users selected');
	}
}

function users_login (status) {

		var title = (status == 'Failure') ? '<span style="color: #ff0000;">Wrong username or password</span>' : 'Login';
		modalWindow = new StickyWinModal({
			allowMultiple: false,
			content: modal_create(title, {
				height : '220px',
				width : '300px',
				content : '<div style="padding: 20px;"><p>Username:<br /><input type="text" id="users_username" style="width: 240px;" /></p><p style="margin-top: 20px;">Password:<br /><input type="password" id="users_password" style="width: 240px;"/></p></div>',
				buttons : [
				{
					icon : 'formaccept',
					text : 'Login',
					onClick : function () {
						
					var values = new Array();
					values['users_username'] = $('users_username').getValue();
					values['users_password'] = $('users_password').getValue();
				
					xajax_usersInterface('login', values);
					}
				},
				{
					icon : 'formcancel',
					text : 'Cancel'
				}
				]				
			}),
			modalOptions: {
				hideOnClick: false
			}
		});
}

/* USERS END */

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

/* TABS BEGIN */

function tab_change (el) {

	tab_element = $(el);
	var tab_index = 1000;
	var childs = '';

	$$('.tab').each(function (el) {
		childs = el.getChildren().filterByTag('div');

		if (el == tab_element) {
			childs[0].setHTML('<img onload="fixPNG(this);" src="images/tabs/tab_left_form.png" alt="" />');
			childs[2].setHTML('<img onload="fixPNG(this);" src="images/tabs/tab_right_form.png" alt="" />');
			el.removeClass('tab-normal').addClass('tab-selected').setStyle('z-index', 2000);
		} else {
			childs[0].setHTML('<img onload="fixPNG(this);" src="images/tabs/tab_left.png" alt="" />');
			childs[2].setHTML('<img onload="fixPNG(this);" src="images/tabs/tab_right.png" alt="" />');
			el.removeClass('tab-selected').addClass('tab-normal').setStyle('z-index', tab_index);
			tab_index--;
		}
	});

	$$('.tab_content').each(function (el) { el.setStyle('display', 'none') });
	var el_tmp = el.getProperty('id').replace('tab_for_', 'tab_content_');
	$(el_tmp).setStyle('display', 'block');
}

/* TABS END */

function roar (msg) {
	var window_width = window.getWidth();
	var left = (window_width - 680) / 2;

	var roar = new Element('div').setStyles({
		'background' : 'url(images/overlay.png) no-repeat',
		'color' : '#fff',
		'font-size' : '60px',
		'font-weight' : 'bold',
		'height' : '60px',
		'left' : left +'px',
		'padding' : '30px 0',
		'position' : 'absolute',
		'text-align' : 'center',
		'top' : '20px',
		'width' : '680px',
		'z-index' : '25000000'
	}).setText(msg).injectInside(document.body);
	
	var roar_disappear = new Fx.Style(roar, 'opacity', {duration: 2000, transition: Fx.Transitions.Circ.easeOut, onComplete: function () {
		roar.remove();
	}});

	(function(){roar_disappear.start(1, .0)}).delay(2000);
}

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/

var Base64 = {

	// private property
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

	// public method for encoding
	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;

		input = Base64._utf8_encode(input);

		while (i < input.length) {

			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);

			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;

			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}

			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

		}

		return output;
	},

	// public method for decoding
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;

		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

		while (i < input.length) {

			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));

			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;

			output = output + String.fromCharCode(chr1);

			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}

		}

		output = Base64._utf8_decode(output);

		return output;

	},

	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++) {

			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}

		}

		return utftext;
	},

	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;

		while ( i < utftext.length ) {

			c = utftext.charCodeAt(i);

			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}

		}

		return string;
	}
}