var BBCode = function(divID, text) {
	this.setDivID(divID);
	this.setText(text);
	this.lineBreaks = new Array();
	this.lineBreaks.push({ascii:'\r\n', html:'<br />'});
	this.lineBreaks.push({ascii:'\r', html:'<br />'});
	this.lineBreaks.push({ascii:'\n', html:'<br />'});
	this.simpleCodes = new Array();
	this.simpleCodes.push({from:'[b]', to:'[/b]', start:'<b>', end:'</b>', noLineBreak:false});
	this.simpleCodes.push({from:'[i]', to:'[/i]', start:'<i>', end:'</i>', noLineBreak:false});
	this.simpleCodes.push({from:'[u]', to:'[/u]', start:'<u>', end:'</u>', noLineBreak:false});
	this.simpleCodes.push({from:'[quote]', to:'[/quote]', start:'<span style="display:block;"><i>"', end:'"</i></span>', noLineBreak:true});
	this.simpleCodes.push({from:'[code]', to:'[/code]', start:'<span style="text-align:left; display:block;"><code>', end:'</code></span>', noLineBreak:true});
	this.simpleCodes.push({from:'[sub]', to:'[/sub]', start:'<sub>', end:'</sub>', noLineBreak:false});
	this.simpleCodes.push({from:'[sup]', to:'[/sup]', start:'<sup>', end:'</sup>', noLineBreak:false});
	this.simpleCodes.push({from:'[left]', to:'[/left]', start:'<span style="text-align:left; display:block;">', end:'</span>', noLineBreak:true});
	this.simpleCodes.push({from:'[right]', to:'[/right]', start:'<span style="text-align:right; display:block;">', end:'</span>', noLineBreak:true});
	this.simpleCodes.push({from:'[center]', to:'[/center]', start:'<span style="text-align:center; display:block;">', end:'</span>', noLineBreak:true});
	this.simpleCodes.push({from:'[justify]', to:'[/justify]', start:'<span style="text-align:justify; display:block;">', end:'</span>', noLineBreak:true});
	this.listCodes = new Array();
	this.listCodes.push({from:'[list]', to:'[/list]', start:'<ul>', end:'</ul>', noLineBreak:true});
	this.listCodes.push({from:'[list=1]', to:'[/list]', start:'<ul style="list-style-type:decimal;">', end:'</ul>', noLineBreak:true});
	this.listCodes.push({from:'[list=a]', to:'[/list]', start:'<ul style="list-style-type:lower-alpha;">', end:'</ul>', noLineBreak:true});
	this.listCodes.push({from:'[list=A]', to:'[/list]', start:'<ul style="list-style-type:upper-alpha;">', end:'</ul>', noLineBreak:true});
	this.listCodes.push({from:'[list=i]', to:'[/list]', start:'<ul style="list-style-type:lower-roman;">', end:'</ul>', noLineBreak:true});
	this.listCodes.push({from:'[list=I]', to:'[/list]', start:'<ul style="list-style-type:upper-roman;">', end:'</ul>', noLineBreak:true});
}
BBCode.prototype.setDivID = function(value) {
	if (document.getElementById(value)) {
		this.divID = value;
	}
}
BBCode.prototype.setText = function(value) {
	this.text = value;
}
BBCode.prototype.checkParams = function() {
	if (this.divID && this.text) {
		return true;	
	} else {
		return false;	
	}
}
BBCode.prototype.attach = function() {
	if (this.checkParams()) {
		var myText = this.text;
		for (var i = 0; i < this.simpleCodes.length; i++) {
			var searchObject = this.cutText(myText, this.simpleCodes[i].from, this.simpleCodes[i].to, true);
			myText = "";
			for (var j = 0; j < searchObject.texts.length; j++) {
				myText += searchObject.texts[j];
				if (j < searchObject.texts.length - 1) {
					myText += this.simpleCodes[i].start + searchObject.hits[j] + this.simpleCodes[i].end;
				}
			}
		}
		for (var i = 0; i < this.listCodes.length; i++) {
			var searchObject = this.cutText(myText, this.listCodes[i].from, this.listCodes[i].to, true);
			myText = "";
			for (var j = 0; j < searchObject.texts.length; j++) {
				myText += searchObject.texts[j];
				if (j < searchObject.texts.length - 1) {
					var myListArray = searchObject.hits[j].split('[*]');
					if (myListArray.length > 1) {
						var myHit = ""
						for (var k = 1; k < myListArray.length; k++) {
							myHit += '<li>' + myListArray[k] + '</li>';
						}
					} else {
						var myHit = searchObject.hits[j];
					}
					myText += this.listCodes[i].start + myHit + this.listCodes[i].end;
				}
			}
		}
		for (var i = 0; i < this.lineBreaks.length; i++) {
			myText = myText.split(this.lineBreaks[i].ascii).join(this.lineBreaks[i].html);
		}
		for (var i = 0; i < this.simpleCodes.length; i++) {
			if (this.simpleCodes[i].noLineBreak) {
				myText = myText.split(this.simpleCodes[i].start + '<br />').join(this.simpleCodes[i].start);
				myText = myText.split(this.simpleCodes[i].end + '<br />').join(this.simpleCodes[i].end);
			}
		}
		for (var i = 0; i < this.listCodes.length; i++) {
			if (this.listCodes[i].noLineBreak) {
				myText = myText.split(this.listCodes[i].start + '<br />').join(this.listCodes[i].start);
				myText = myText.split(this.listCodes[i].end + '<br />').join(this.listCodes[i].end);
			}
		}
		document.getElementById(this.divID).innerHTML = myText;
	}
}
BBCode.prototype.cutText = function(text, fromSearch, toSearch, inline) {
	var searchArray = new Array();
	var startingIndex = 0;
	while (text.indexOf(fromSearch, startingIndex) > -1) {
		var recentIndexStart = text.indexOf(fromSearch, startingIndex);
		var recentIndexEnd = text.indexOf(toSearch, recentIndexStart);
		if (recentIndexEnd > -1) {
			searchArray[recentIndexStart] = new Object();
			searchArray[recentIndexStart].start = recentIndexStart;
			searchArray[recentIndexStart].end = startingIndex = recentIndexEnd + toSearch.length;
		} else {
			break;	
		}
	}
	var searchArrayOriginal = new Array();
	var searchArrayModified = new Array();
	for (var i in searchArray) {
		var searchText = text.substring(searchArray[i].start, searchArray[i].end);
		searchArrayOriginal.push(searchText);
		if (inline) {
			searchText = searchText.substring(fromSearch.length, searchText.length - toSearch.length);
		}
		searchArrayModified.push(searchText);
	}
	for (var i = 0; i < searchArrayOriginal.length; i++) {
		text = text.split(searchArrayOriginal[i]).join("::K2System::");
	}
	var textArray = text.split("::K2System::");
	var returnObject = new Object();
	returnObject.texts = textArray;
	returnObject.hits = searchArrayModified;
	return returnObject;
}

