var API = 'api';

var WN_notes = new Array();
var WN_object;
var WN_cnote;

var WN_colours = new Array('FCFFA3','EBF9FF','FFEBEB','D9FFC2','FFDFFF');
var WN_font = 'Verdana';
var WN_sizes = new Array('10px','12px','16px');
var WN_offset = new Array(0,0);
var WN_iposx = 400;
var WN_iposy = 200;
var WN_iwidth = 180;
var WN_iheight = 180;
var WN_highz = 10000;

var IE = (navigator.userAgent.indexOf('MSIE') != -1)? true : false;

function WN_Widget(obj, id, uid, title, text, color, width, height, posx, posy, zindex, font, size, tbold, titalic, mine, auth)
{
	// object variables
	var _this = obj;
	var _id = id;
	var _left = (posx)? posx : WN_iposx;
	var _top = (posy)? posy : WN_iposy;
	var _width = (width)? width : WN_iwidth;
	var _height = (height)? height : WN_iheight;
	var _zindex = (zindex)? zindex : WN_highz++;
	var _title = (title)? title : 'New note';
	var _text = (text)? text : '';
	var _colour = (color)? color : 0;
	var _font = (font)? font : WN_font;
	var _size = (size)? size : 0;
	var _tbold = (tbold)? tbold : 0;
	var _titalic = (titalic)? titalic : 0;
	var _mine = (mine)? 1 : 0;
	var _auth = (auth)? 1 : 0;

	
	// database variables
	var _uid; if (uid) _uid = uid;


	// object objects
	var _ajax_obj;


	// external functions
	this.move = move;
	this.updatePosition = updatePosition;
	this.resize = resize;
	this.updateSize = updateSize;
	this.createNote = createNote;
	this.initialise = initialise;
	this.closeNote = closeNote;
	this.removeNote = removeNote;

	this.ajaxInsert = ajaxInsert;
	this.ajaxUpdate = ajaxUpdate;
	this.ajaxDelete = ajaxDelete;
	this.ajaxRequest = ajaxRequest;
	this.ajaxError = ajaxError;


	/* FUNCTIONS */
	
	function writeNote()
	{
		var wn_container = document.createElement('div');
		wn_container.setAttribute('id', _id);
		wn_container.className = 'wn_container';
		
			var wn_close = document.createElement('div');
			wn_close.className = 'wn_close';
			wn_container.appendChild(wn_close);
			
			var wn_public = document.createElement('div');
			wn_public.className = 'wn_public';
			wn_container.appendChild(wn_public);
			
			var wn_resize = document.createElement('div');
			wn_resize.className = 'wn_resize';
			wn_container.appendChild(wn_resize);
			
			var wn_sh_t = document.createElement('div');
			wn_sh_t.className = 'wn_sh_t';
			wn_container.appendChild(wn_sh_t);
			
			var wn_sh_l = document.createElement('div');
			wn_sh_l.className = 'wn_sh_l';
			
				var wn_sh_r = document.createElement('div');
				wn_sh_r.className = 'wn_sh_r';
				
					var wn_title = document.createElement('h1');
					wn_title.className = 'wn_title unselectable';
						var wn_title_t = document.createTextNode(_title);
						wn_title.appendChild(wn_title_t);
					wn_sh_r.appendChild(wn_title);
					
					var wn_body = document.createElement('p');
					wn_body.className = 'wn_body';

						var wn_textarea = document.createElement('textarea');
							wn_textarea.setAttribute('name', 'txt_'+_id);
							wn_textarea.setAttribute('readonly', 'readonly');
							var text = (IE)? _text.replace(/\n/g, '\r') : _text;
							var wn_textarea_t = document.createTextNode(text);
							wn_textarea.appendChild(wn_textarea_t);
						wn_body.appendChild(wn_textarea);

					wn_sh_r.appendChild(wn_body);
				
				wn_sh_l.appendChild(wn_sh_r);
				
			wn_container.appendChild(wn_sh_l);
				
			var wn_sh_b = document.createElement('div');
			wn_sh_b.className = 'wn_sh_b';
			wn_container.appendChild(wn_sh_b);
			
			var wn_sh_tl = document.createElement('div');
			wn_sh_tl.className = 'wn_sh_tl';
			wn_container.appendChild(wn_sh_tl);
			
			var wn_sh_tr = document.createElement('div');
			wn_sh_tr.className = 'wn_sh_tr';
			wn_container.appendChild(wn_sh_tr);
			
			var wn_sh_bl = document.createElement('div');
			wn_sh_bl.className = 'wn_sh_bl';
			wn_container.appendChild(wn_sh_bl);

			var wn_sh_br = document.createElement('div');
			wn_sh_br.className = 'wn_sh_br';
			wn_container.appendChild(wn_sh_br);
		
		document.body.appendChild(wn_container);
	}
	
	
	function initialise()
	{
		// set up ajax object
		if (!_ajax_obj)
		{
			_ajax_obj = new AJAX_Object();
			_ajax_obj.xmlSetLoading(eval(_this).ajaxRequest);
			_ajax_obj.xmlSetError(eval(_this).ajaxError);
		}
		
		// disableselect (for IE)
		if (IE) document.body.onselectstart = function() { return false; };

		if (_mine)
		{
			// initialise drag
			if (document.addEventListener) document.getElementById(_id).getElementsByTagName('h1')[0].addEventListener('mousedown', WN_mstart, false);
			else if (document.attachEvent) document.getElementById(_id).getElementsByTagName('h1')[0].attachEvent('onmousedown', WN_mstart);

			// initialise resize
			if (document.addEventListener) document.getElementById(_id).getElementsByTagName('div')[2].addEventListener('mousedown', WN_rstart, false);
			else if (document.attachEvent) document.getElementById(_id).getElementsByTagName('div')[2].attachEvent('onmousedown', WN_rstart);
		}
		
		if (_auth)
		{
			// initialise close
			if (document.addEventListener) document.getElementById(_id).getElementsByTagName('div')[0].addEventListener('click', WN_close, false);
			else if (document.attachEvent) document.getElementById(_id).getElementsByTagName('div')[0].attachEvent('onclick', WN_close);
		}

		// add note to notes array
		WN_notes.push(new Array(_this,_id));
	}
	
	function createNote(id)
	{
		// set up ajax object
		_ajax_obj = new AJAX_Object();
		_ajax_obj.xmlSetLoading(eval(_this).ajaxRequest);
		_ajax_obj.xmlSetError(eval(_this).ajaxError);
	
		// create note in db
		_ajax_obj.xmlInit(eval(_this).ajaxInsert);
		_ajax_obj.xmlRequest(API,'a=insert&d=mb&bid='+BID+'&id='+id);
	}

	function setupNote()
	{
		_mine = 1;
		
		//write note
		writeNote();
		
		// set note properties
		document.getElementById(_id).style.top = _top + 'px';
		document.getElementById(_id).style.left = _left + 'px';
		document.getElementById(_id).style.width = _width + 'px';
		document.getElementById(_id).style.height = _height + 'px';
		document.getElementById(_id).getElementsByTagName('p')[0].style.height = (_height - 28) + 'px';
		document.getElementById(_id).getElementsByTagName('textarea')[0].style.height = (_height - 28) + 'px';
		document.getElementById(_id).style.zIndex = _zindex;
		document.getElementById(_id).style.backgroundColor = '#' + WN_colours[_colour];
		document.getElementById(_id).getElementsByTagName('textarea')[0].style.fontFamily = _font + ', sans-serif';
		document.getElementById(_id).getElementsByTagName('textarea')[0].style.fontSize = WN_sizes[_size];
		document.getElementById(_id).getElementsByTagName('textarea')[0].style.fontWeight = (_tbold==1)? 'bold' : '';
		document.getElementById(_id).getElementsByTagName('textarea')[0].style.fontStyle = (_titalic==1)? 'italic' : '';
		
		initialise();
	}
	
	function move(x,y)
	{
		// position container
		document.getElementById(_id).style.top = y - WN_offset[1] + 'px';
		document.getElementById(_id).style.left = x - WN_offset[0] + 'px';
	}

	function updatePosition(x,y)
	{
		if (_top != (y - WN_offset[1]) || _left != (x - WN_offset[0]))
		{
			// save position
			_top  = y - WN_offset[1];
			_left = x - WN_offset[0];

			_ajax_obj.xmlInit(eval(_this).ajaxUpdate);
			_ajax_obj.xmlRequest(API,'a=update&d=mb&bid='+BID+'&id='+_uid+'&item=position&value='+_left+','+_top);
		}
	}
	
	function resize(x,y)
	{
		var width  = x - parseInt(document.getElementById(_id).style.left);
		var height = y - parseInt(document.getElementById(_id).style.top);
		
		if (width < 78) width = 78;
		if (height < 28) height = 28;

		// resize the container
		document.getElementById(_id).style.width = width + WN_offset[0] + 'px';
		document.getElementById(_id).style.height = height + WN_offset[1] + 'px';
		
		// resize the text
		document.getElementById(_id).getElementsByTagName('p')[0].style.height = (height - 28) + WN_offset[1]  + 'px';
		document.getElementById(_id).getElementsByTagName('textarea')[0].style.height = (height - 28) + WN_offset[1] + 'px';
	}

	function updateSize(x,y)
	{
		var width  = x - parseInt(document.getElementById(_id).style.left);
		var height = y - parseInt(document.getElementById(_id).style.top);
		
		if (_width != (width + WN_offset[0]) || _height != (height + WN_offset[1]))
		{
			// save dimensions
			_width = width + WN_offset[0];
			_height = height + WN_offset[1];

			_ajax_obj.xmlInit(eval(_this).ajaxUpdate);
			_ajax_obj.xmlRequest(API,'a=update&d=mb&bid='+BID+'&id='+_uid+'&item=dimension&value='+_width+','+_height);
		}
	}

	function closeNote()
	{
		if (confirm('Do you really want to remove this note?')) eraseNote();
	}

	function removeNote()
	{
		// remove note
		document.body.removeChild(document.getElementById(_id));
	}

	function eraseNote()
	{
		// remove note from db
		_ajax_obj.xmlInit(eval(_this).ajaxDelete);
		_ajax_obj.xmlRequest(API,'a=delete&d=mb&bid='+BID+'&id='+_uid);
	}
	
	function killNote()
	{
		// remove from window
		removeNote();

		// unregister note
		for (var x = 0; x < WN_notes.length; x++)
			if (_id == WN_notes[x][1])
				WN_notes.splice(x,1);

		// delete object
		if (!IE) eval ('delete '+_this);
	}


	/* Ajax Functions */

	function ajaxInsert(xml)
	{
		if (xml.getElementsByTagName('ajaxresult').length == 1)
		{
			if (xml.getElementsByTagName('result')[0].firstChild.nodeValue == '1')
			{
				_uid	 = xml.getElementsByTagName('uid')[0].firstChild.nodeValue;
				_title	 = (xml.getElementsByTagName('title')[0].firstChild)?	xml.getElementsByTagName('title')[0].firstChild.nodeValue : '';
				_text	 = (xml.getElementsByTagName('text')[0].firstChild)?	xml.getElementsByTagName('text')[0].firstChild.nodeValue : '';
				_colour	 = (xml.getElementsByTagName('color')[0].firstChild)?	xml.getElementsByTagName('color')[0].firstChild.nodeValue : 0;
				_font	 = (xml.getElementsByTagName('font')[0].firstChild)?	xml.getElementsByTagName('font')[0].firstChild.nodeValue : 'Verdana';
				_size	 = (xml.getElementsByTagName('size')[0].firstChild)?	xml.getElementsByTagName('size')[0].firstChild.nodeValue : 0;
				_tbold 	 = (xml.getElementsByTagName('bold')[0].firstChild)?	xml.getElementsByTagName('bold')[0].firstChild.nodeValue : 0;
				_titalic = (xml.getElementsByTagName('italic')[0].firstChild)?	xml.getElementsByTagName('italic')[0].firstChild.nodeValue : 0;

				//initialise note
				setupNote();

				writeToConsole('Created new note');
			}
			else if (xml.getElementsByTagName('result')[0].firstChild.nodeValue == '2')
			{
				writeToConsole('Alert: The note could not be added because it already exists in this Message Board.',2);

//				alert('This note already exists in this Message Board.');

				// delete object
				eval ('delete '+_this);

				// unregister note
				for (var x = 0; x < WN_notes.length; x++)
					if (_id == WN_notes[x][1])
						WN_notes.splice(x,1);
			}
			else if (xml.getElementsByTagName('result')[0].firstChild.nodeValue == '3')
			{
				writeToConsole('Alert: The note could not be added because it is no longer public',2);

				// delete object
				eval ('delete '+_this);

				// unregister note
				for (var x = 0; x < WN_notes.length; x++)
					if (_id == WN_notes[x][1])
						WN_notes.splice(x,1);
			}
			else
			{
				writeToConsole('Alert: The note could not be added. Please check your connection and refresh this page',1);

				// delete object
				eval ('delete '+_this);

				// unregister note
				for (var x = 0; x < WN_notes.length; x++)
					if (_id == WN_notes[x][1])
						WN_notes.splice(x,1);
			}
		}
		else
		{
			writeToConsole('Alert: The note could not be added. Please check your connection and refresh this page',1);
			// delete object
			eval ('delete '+_this);

			// unregister note
			for (var x = 0; x < WN_notes.length; x++)
				if (_id == WN_notes[x][1])
					WN_notes.splice(x,1);
		}
	}

	function ajaxUpdate(xml)
	{
		if (xml.getElementsByTagName('ajaxresult').length == 1)
		{
			if (xml.getElementsByTagName('result')[0].firstChild.nodeValue == 1)
			{
				if (xml.getElementsByTagName('dimension').length) var u_item = 'dimension';
				else if (xml.getElementsByTagName('position').length) var u_item = 'position';
				else if (xml.getElementsByTagName('z').length) var u_item = 'z';
				
				writeToConsole('Updated note '+u_item);
			}
			else writeToConsole('Alert: The note could not be saved. Please check your connection and refresh this page',1);
		}
		else writeToConsole('Alert: The note could not be saved. Please check your connection and refresh this page',1);
	}

	function ajaxDelete(xml)
	{
		if (xml.getElementsByTagName('ajaxresult').length == 1)
		{
			if (xml.getElementsByTagName('result')[0].firstChild.nodeValue == '1')
			{
				killNote();
				
				writeToConsole('Note deleted');
			}
		}
		else writeToConsole('Alert: The note could not be deleted. Please check your connection and refresh this page',1);
	}
	
	function ajaxRequest()
	{
		writeToConsole('Saving...',-1);
	}
	
	function ajaxError()
	{
			writeToConsole('Alert: Could not contact the server. Please check your connection and refresh this page',1);
	}
}



// Global Move Functions

function WN_mstart(e)
{
	if (e.pageX)
	{
		WN_offset[0] = e.pageX - parseInt(this.parentNode.parentNode.parentNode.style.left);
		WN_offset[1] = e.pageY - parseInt(this.parentNode.parentNode.parentNode.style.top);
	}
	else if (window.event.clientX)
	{
		WN_offset[0] = window.event.clientX - parseInt(window.event.srcElement.parentNode.parentNode.parentNode.style.left);
		WN_offset[1] = window.event.clientY - parseInt(window.event.srcElement.parentNode.parentNode.parentNode.style.top);
	}

	if (!window.event)
		WN_object = this.parentNode.parentNode.parentNode;
	else if (window.event)
		WN_object = window.event.srcElement.parentNode.parentNode.parentNode;

	if (document.addEventListener)
	{
		document.addEventListener('mouseup', WN_mstop, false);
		document.addEventListener('mousemove', WN_move, false);
	}
	else if (document.attachEvent)
	{
		document.attachEvent('onmouseup', WN_mstop);
		document.attachEvent('onmousemove', WN_move);
	}
}

function WN_mstop(e)
{
	if (document.removeEventListener)
	{
		document.removeEventListener('mousemove', WN_move, false);
		document.removeEventListener('mouseup', WN_mstop, false);
	}
	else if (document.detachEvent)
	{
		document.detachEvent('onmousemove', WN_move);
		document.detachEvent('onmouseup', WN_mstop);
	}

	var note = retrieveNote(WN_object.id);

	if (e.pageX)
		note.updatePosition(e.pageX, e.pageY);
	else if (window.event.clientX)
		note.updatePosition(window.event.clientX, window.event.clientY);
}

function WN_move(e)
{
	var note = retrieveNote(WN_object.id);

	if (e.pageX)
		note.move(e.pageX, e.pageY);
	else if (window.event.clientX)
		note.move(window.event.clientX, window.event.clientY);
}


// Global Resize functions

function WN_rstart(e)
{
	if (e.pageX)
	{
		WN_offset[0] = parseInt(this.parentNode.style.width)  - (e.pageX - parseInt(this.parentNode.style.left));
		WN_offset[1] = parseInt(this.parentNode.style.height) - (e.pageY - parseInt(this.parentNode.style.top));
	}
	else if (window.event.clientX)
	{
		WN_offset[0] = parseInt(window.event.srcElement.parentNode.style.width)  - (window.event.clientX - parseInt(window.event.srcElement.parentNode.style.left));
		WN_offset[1] = parseInt(window.event.srcElement.parentNode.style.height) - (window.event.clientY - parseInt(window.event.srcElement.parentNode.style.top));
	}

	if (this.parentNode)
		WN_object = this.parentNode;
	else if (window.event.srcElement.parentNode.id)
		WN_object = window.event.srcElement.parentNode;

	if (document.addEventListener)
	{
		document.addEventListener('mouseup', WN_rstop, false);
		document.addEventListener('mousemove', WN_resize, false);
	}
	else if (document.attachEvent)
	{
		document.attachEvent('onmouseup', WN_rstop);
		document.attachEvent('onmousemove', WN_resize);
	}
}

function WN_rstop(e)
{
	if (document.removeEventListener)
	{
		document.removeEventListener('mousemove', WN_resize, false);
		document.removeEventListener('mouseup', WN_rstop, false);
	}
	else if (document.detachEvent)
	{
		document.detachEvent('onmousemove', WN_resize);
		document.detachEvent('onmouseup', WN_rstop);
	}

	var note = retrieveNote(WN_object.id);

	if (e.pageX)
		note.updateSize(e.pageX, e.pageY);
	else if (window.event.clientX)
		note.updateSize(window.event.clientX, window.event.clientY);
}

function WN_resize(e)
{
	var note = retrieveNote(WN_object.id);

	if (e.pageX)
		note.resize(e.pageX, e.pageY);
	else if (window.event.clientX)
		note.resize(window.event.clientX, window.event.clientY);
}


// Close function

function WN_close()
{
	if (this.parentNode)
		WN_object = this.parentNode;
	else if (window.event.srcElement.parentNode.id)
		WN_object = window.event.srcElement.parentNode;
	
	var note = retrieveNote(WN_object.id);

	note.closeNote();
}



// Other functions

function retrieveNote(id)
{
	for (var x = 0; x < WN_notes.length; x++)
	{
		if (id == WN_notes[x][1])
		{
			break;
		}
	}
	return eval(WN_notes[x][0]);
}

function sort2D(x,y) {
  if (x[1] < y[1]) return -1;
  if (x[1] > y[1]) return 1;
  return 0;
}

function myEncodeURI(text)
{
	var e_text = '';

	for (var x = 0; x < text.length; x++)
	{
		var tchar = text.substr(x,1).charCodeAt(0);
		
		tchar = tchar.toString(16);
		tchar = "%" + tchar;
		
		e_text += tchar;
	}

	return e_text;	
}

function cancelBubble(e)
{
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

