// TEMPLATE BIJAK WARNA PINTAR
// Idea by Cikgu Karmin Abbas
// Programming by Muhammad Hirman
// Last edited 15 November 2003

/*
	CONFIGURATION VARIABLES EXAMPLE
	
	// enable line breaks within segments?
	var lineBreaksEnabled = 1;
	
	// no of segments in a karangan
	var segments = 1;
	
	// corresponding colours for each segment
	var segmentColours = new Array("#009900", "#003300", "#009900", "#003300", "#009900", "#003300", "#009900", "#003300");

	// enable segment colours?
	var segmentColoursEnabled = 0;

	// colourful elements
	var elements = new Array("fnama", "fkerja", "fsendi", "fayat", "gambaran", "seimbang", "logik", "siapa", "berlaku", "mana", "bagaimana", "tujuan");

	// corresponding colours for each element
	var colours = new Array("#CC0000", "#CC66CC", "#0000CC", "#CC9966", "#339933", "#663333", "#663399", "#CC0000", "#CC66CC", "#0000CC", "#CC9966", "#669999");

	// enable counter?
	var counterEnabled = false;
*/

//////////////////// MAIN SCRIPT ////////////////////

// INITIALISATION VARIABLES

// Segment Variables

var curPage = 1;
var db = new Array();

// Word Count variables

var curWordCount = 0;
var restWordCount = 0;
var totalWordCount = 0;

// Bar Chart variables

var BCelementCounts = new Array();
var BCelements = new Array();
var BCcolours = new Array();

BCcolours = colours;
BCcolours.push("#000000");

BCelements = elements;
BCelements.push("Biasa");

// DISPLAY FUNCTIONS

function initRichEdit() {
	el = document.frames["edit"];
	d = el.document;
	d.designMode = "On";
	//void(0);

	el.getRange = function () {
		return this.document.selection.createRange();
	}
	
	el.document.onkeydown = function () {
  	if (el.event.keyCode == 13) {	// ENTER
			var sel = el.document.selection;
			if (sel.type == "Control")
				return;
			
			var r = sel.createRange();	
			r.pasteHTML("<BR>");
			el.event.cancelBubble = true; 
			el.event.returnValue = false; 

			r.select();
			r.moveEnd("character", 1);
			r.moveStart("character", 1);
			r.collapse(false);
			
			return false;
		}
	}
	
	el.document.onkeypress = 
	el.document.onkeyup = function () { 
		if (el.event.keyCode == 13) {	// ENTER
			el.event.cancelBubble = true;
			el.event.returnValue = false;
			return false;
		}
	}
	
	document.onkeydown = 
	document.onkeypress = 
	document.onkeyup = 
	el.document.onkeydown =	
	el.document.onkeypress = 
	el.document.onkeyup = function () { 
		updatePreviewBox();
		updateCounter();
	}
	
	setTimeout('enablePage()', 100);
}

function enablePage () {
	loadPage(1);
	updatePreviewBox();
	updateCounter();
	document.onclick = function () {return true;}
}

function disablePage () {
	document.onclick = function () {
		return false;
	}
}

function tanda (elemen) {
	
	el = document.frames["edit"];
	r = el.getRange(); 
	
	// if selection has text in it
	if (r.text.replace(/\s/g, "") != "") {
		
		rangeTrim(r);
		
		r.execCommand('foreColor', 'false', colours[arrayIndexOf(elemen, elements)]);
		updatePreviewBox();
		r.select();
		r.collapse(false);
		//void(0);
		
	}
}

function makeDefault () {
	r = document.frames["edit"].getRange(); 
	if (r.text.replace(/\s/g, "") != "") {
		rangeTrim(r);
		r.execCommand("removeFormat");
		updatePreviewBox();
		r.select();
		//void(0);
	}
}

function karanganBaru (n) {
	if (confirm("Buangkan segala data dan karang semula cerita ini?")) {
		// set all pages to zero
		for (i=0;i<db.length;i++) {
			db[i] = "";
		}

		// set cur page to 1
		curPage = 1;
		
		// clear editing region
		document.frames["edit"].document.body.innerHTML = "";
		
		// reset word counts
		curWordCount = 0;
		restWordCount = 0;
		totalWordCount = 0;
		
		updatePreviewBox();
		updateCounter();
	}
}

function updatePreviewBox () {
	k = getWholeKarangan();
	document.frames["previewBox"].document.body.innerHTML = k;
}

function updateCounter() {
	if (counterEnabled == true) {
		count = getNoOfWords();
		counter.innerText = count;
	}
}

// STORAGE FUNCTIONS

function makeDB () {
	for (i=0; i < segments; i++) {
		db[i] = "";
	}
}

function getPage(page) {
	return db[page-1];
}

function loadPage (page) {
	document.frames["edit"].document.body.innerHTML = db[page-1];
}

function goToPage(destPage){
	// translate to zero index values
	destPage -= 1;
	curPage -= 1;
	
	// retrieve cur text c
	el = document.frames["edit"];
	c = el.document.body.innerHTML;
	
	// store wordCounts
	curWordCount = wordCount(stripText(el.document.body.innerHTML));
	totalWordCount = curWordCount + restWordCount;
	
	// store cur text
	db[curPage] = c;
	
	// retrieve new text
	newC = db[destPage];
	
	// update wordCounts
	curWordCount = wordCount(stripText(newC));
	restWordCount = totalWordCount - curWordCount;
	
	// store new page as cur page
	curPage = destPage;
	
	// display new text
	el.document.body.innerHTML = newC;
	
	// translate to real values
	curPage += 1;
	
	el.focus();
}

function getWholeKarangan () {
	// translate to zero index values
	curPage -= 1;
	
	// declare and initialise variables
	var karangan = "";
	
	// retrieve cur text c
	el = document.frames["edit"];
	c = el.document.body.innerHTML;
	
	// store cur text
	db[curPage] = c;
	
	// compile whole karangan
	for (i=0;i < db.length;i++) {
		z = db[i];
		zTemp = z.toLowerCase();
		fntStr = (segmentColoursEnabled) ? '<font color="' + segmentColours[i] + '">' : "";
		if (zTemp.replace(/\s/g, "") != "") {
			karangan += zTemp.indexOf("p>") != -1 ? "" : "<p>";
			karangan += fntStr;
			karangan += z;
			karangan += (segmentColoursEnabled) ? '</font>' : "";
		}
	}
	
	// translate to real values
	curPage += 1;
		
	return karangan;
}

function saveKarangan(){
	updatePreviewBox();
	karangan = getWholeKarangan();
	someVar = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' +
	'<HTML><HEAD><TITLE></TITLE>' +
	'<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">' +
	'</HEAD><BODY>' + karangan + '</BODY></HTML>';
	
	SaveFrame.document.open("text/html","replace");
	SaveFrame.document.write(someVar);
	SaveFrame.document.close();
	SaveFrame.document.execCommand('SaveAs');
}

function copyKarangan(){
	updatePreviewBox();
	el = document.frames["previewBox"];
	x = el.document.body.createTextRange();
	x.execCommand('Copy');
	alert("Karangan anda telah disalinkan ke clipboard dan boleh ditampalkan ke dalam editor kesukaan anda.");
	//void(0);
}

function getNoOfWords() {
	curWordCount = wordCount(stripText(getPage(curPage))); //alert(karangan);
	
	return restWordCount + curWordCount;
}

function stripText (theStr) {
	htmlTags = /<[/]?\w+[^>]*>/gi;
	extraSpaces = /\s{2,}/gi;
	nobrs = /&nbsp;/gi;
	
	theStr = theStr.replace(htmlTags, " "); //alert("after replacing html tags: |" + theStr + "|");
	theStr = theStr.replace(nobrs, " "); //alert("after replacing nobrs: |" + theStr + "|");
	theStr = theStr.replace(extraSpaces, " "); //alert("after replacing spaces: |" + theStr + "|");
	theStr = strTrim(theStr);
	
	return theStr;
}

function strTrim (theStr) {
	while (theStr.charAt(0) == ' ') {
		theStr = theStr.substring(1);
	}
	while (theStr.charAt(theStr.length - 1) == ' ') {
		theStr = theStr.substring(0, theStr.length - 1);
	}
	return theStr;
}

function wordCount (theStr) {
	theStr = strTrim(theStr);
	
	if (theStr.length == 0) 
		return 0;
		
	else {
		theStr = theStr.replace(/\s{2,}/g, " ");
		
		var i = 1;
		while (theStr.indexOf(" ") != -1) {
			i++;
			theStr = theStr.substring(theStr.indexOf(" ") + 1);
		}
		
		return i;
	}
}

function getBCelementCounts () {
	// var theKarangan = getWholeKarangan();
	var theKarangan =  db.join(' ');
	
	var fontOpenRE = /<font color="?(.......)"?>/i;
	var nonFontTags = /<(?!font|\/font)[^>]*>/gi;
	
	var elementStack = new Array();
	var elementCountStack = new Array();
	var curString = new String();
	
	var curWordCount;
	
	for (i = 0; i < BCelements.length; i++) {
		BCelementCounts[i] = 0;
	}
	
	// fontOpen = fontOpenRE.exec(theKarangan); alert(fontOpen + ", " + fontOpenRE.lastIndex);
	
	var endIndex;
	
	var level = 0;
	var maxLevel = 0;
	
	theKarangan = theKarangan.replace(nonFontTags, " "); // alert(theKarangan);
	theKarangan = strTrim(theKarangan);
	
	while (theKarangan != "") {
		//alert("BEGIN\ntheKarangan: " + theKarangan);
	
		if (theKarangan.indexOf('<') == 0) { // it begins with a tag
			//alert("begins with tag");
		
			if (theKarangan.charAt(1) != '/') { // it's an opening tag
				//alert("opening tag");
				
				level++;
				maxLevel = (level > maxLevel) ? level : maxLevel;
			
				fontOpen = fontOpenRE.exec(theKarangan);
				//alert("color is " + fontOpen[1]);
				
				curColorIndex = arrayIndexOf(fontOpen[1], colours);
				//alert("color index is " + curColorIndex);
				
				curElement = elements[curColorIndex];
				//alert("beginning " + curElement);
				
				elementStack.push(curElement);
				
				endIndex = fontOpen.lastIndex;
				
			} else { // it's a closing tag
				//alert("closing tag");
				
				level--;
				
				curElement = elementStack.pop();
				//alert("ending " + curElement);
				
				curWordCount = elementCountStack.pop();
				//alert("adding " + curWordCount + " to " + curElement);
				
				BCelementCounts[arrayIndexOf(curElement, elements)] += curWordCount;
				
				endIndex = 7; // '</FONT>' is 7 characters! End after closing  tag.
				
			}
			
		} else { // it begins with words
			//alert("begins with words");
		
			if (theKarangan.indexOf('<') > 0) { // tags ahead...
				//alert("tags ahead");
			
				curString = theKarangan.substring(0, theKarangan.indexOf('<'));
				
				endIndex = theKarangan.indexOf('<'); // End at next tag
				
			} else { // no tags ahead
				//alert("no tags ahead");
			
				curString = theKarangan;
				
				endIndex = theKarangan.length; // End
				
			}
			
			curWordCount = wordCount(curString);
			
			if (level == 0) { // no element specified
				BCelementCounts[BCelements.length - 1] += curWordCount;
				
			} else if (level < maxLevel && elementCountStack.length != 0) {
				storedWordCount = elementCountStack.pop();
				elementCountStack.push(curWordCount + storedWordCount);
				
			} else {
				elementCountStack.push(curWordCount);
				
			}
			
		}
		
		theKarangan = theKarangan.substring(endIndex);
		// alert("END\ntheKarangan: " + theKarangan);
	}
	
}

function phpSave () {
	// retrieve cur text c
	el = document.frames["edit"];
	c = el.document.body.innerHTML;
	
	// store cur text
	db[curPage-1] = c;
	
	story = db.join("||");
		
	// saverFrame.document.forms[0].elements[0].value = storyID;
	saverFrame.document.forms[0].story.value = story;
	saverFrame.document.forms[0].submit();
	saverFrame.alert("Karangan anda telah disimpan.");
}

// MISC. FUNCTIONS

function arrayIndexOf(k, l) {
	for(i=0;i<l.length;i++) {
		if (l[i].toString().toLowerCase() == k.toString().toLowerCase()) return i;
	}
}

function rangeTrim (textRange) {
	while (textRange.text.charAt(0) == " ") {
		textRange.moveStart("character", 1);
	}
	while (textRange.text.charAt(textRange.text.length-1) == " ") {
		textRange.moveEnd("character", -1);
	}
}

// PAGE MARKING FUNCTIONS (deprecated with use of fully-graphical interface)

function markPage () {
n = curPage;
eval("link" + n + ".className = 'bahagianIni'");
eval("link" + n + ".onclick = function () { return false }");
}

function deMarkPage() {
n = curPage;
eval("link" + n + ".className = 'bahagian'");
eval("link" + n + ".onclick = function () { return true }");
}

//////////////////// INITIALIZATION /////////////////////

disablePage();
makeDB();

window.onload = function () {
	initRichEdit();
	}