var http_request = false;
var savedCursorPosition = 0;
var justPressedControl = false;

Array.prototype.indexOf=function(o,i){for(var j=this.length,i=i<0?i+j<0?0:i+j:i||0;i<j&&this[i]!==o;i++);return j<=i?-1:i}

function browserIsMac() {
	browser = navigator.platform;
	if(browser.indexOf('Mac')>-1){
		return true;
	}else{
		return false;
	}
}

//
//-----------------> AJAX
//
function makePOSTRequest(url, parameters) {
   http_request = false;
   if (window.XMLHttpRequest) { // Mozilla, Safari,...
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType) {
      	// set type accordingly to anticipated content type
         //http_request.overrideMimeType('text/xml');
         http_request.overrideMimeType('text/html');
      }
   } else if (window.ActiveXObject) { // IE
      try {
         http_request = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
         try {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
         } catch (e) {}
      }
   }
   if (!http_request) {
      alert('Cannot create XMLHTTP instance');
      return false;
   }
   
   http_request.onreadystatechange = alertContents;
   http_request.open('POST', url, true);
   http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   http_request.setRequestHeader("Content-length", parameters.length);
   http_request.setRequestHeader("Connection", "close");
   http_request.send(parameters);
}

function alertContents() {
   if (http_request.readyState == 4) {
      if (http_request.status == 200) {
         //alert(http_request.responseText);
         result = http_request.responseText;
         document.getElementById('myspan').innerHTML = result;
         document.getElementById('wordlist').style.display = 'block';
         resizeWordList();
      } else {
         alert('There was a problem with the request.');
      }
   }
}

function get(word) {
   var poststr = "rhyme=" + word;
   makePOSTRequest('getrhyme.php', poststr);
}

//
//-----------------> OTHER
//

function domOffsetTop(node) {
	var y = node.offsetTop;
	var parent = node.offsetParent;
	while(parent && !parent.cbe) {
		y += parent.offsetTop;
		parent = parent.offsetParent;
	}
	return y;
}

function resizeWordList() {
	node = document.getElementById('wordscontent');
	node.style.height = null;
	if(node.clientHeight>=442) {
		node.style.height = '442px';
	}else if(node.clientHeight<=40){
		node.style.height = '40px';
	}
	totalHeight = document.getElementById('wordcontainer').clientHeight;
	totalHeight = (totalHeight-parseInt(document.getElementById('words').style.marginTop));
	topMargin = tempY-domOffsetTop(document.getElementById('rightcolumn'))-(totalHeight/2);
	if(topMargin<0) topMargin = 0;
	if(topMargin + totalHeight > 467) topMargin = 467-totalHeight;
	document.getElementById('words').style.marginTop = topMargin+'px';
}

function trace(content) {
	document.getElementById('debugdiv').style.display = 'block';
	document.getElementById('debug').innerHTML += content+'\n';
}

function correctCursorPosition(node, pos) {
	selectionPoint = pos;
	textUntilSelPoint = node.value.substring(0,selectionPoint);
	textRegLineBreaks = textUntilSelPoint.replace(/\r\n/g,"\n");
	newSelectionPoint = textRegLineBreaks.length;
	return newSelectionPoint;
}

function setCursorPosition(node, pos) {
	newSelectionPoint = correctCursorPosition(node, pos);
	// document.trace.tracer.value = "curs="+pos+" ccurs="+newSelectionPoint;
	if (node.createTextRange) {
		var range = node.createTextRange();
		range.collapse(true);
		range.moveEnd('character', newSelectionPoint);
		range.moveStart('character', newSelectionPoint);
		range.select();
	}
	else if (node.setSelectionRange) {
		node.focus();
		node.setSelectionRange(newSelectionPoint, newSelectionPoint);
	}	
}

function getCursorPosition(node){
	var textarea = node;
	textarea.focus();

	// get selection in firefox, opera, …

	if (typeof(textarea.selectionStart) == 'number')

	{ 
				originalSelPoint = textarea.selectionStart;

	}else if(document.selection){
		var selection_range = document.selection.createRange().duplicate();

		if (selection_range.parentElement() == textarea) { // Check that the selection is actually in our textarea
			// Create three ranges, one containing all the text before the selection,
			// one containing all the text in the selection (this already exists), and one containing all
			// the text after the selection.
			var before_range = document.body.createTextRange();
			before_range.moveToElementText(textarea); // Selects all the text
			before_range.setEndPoint("EndToStart", selection_range); // Moves the end where we need it

			var after_range = document.body.createTextRange();
			after_range.moveToElementText(textarea); // Selects all the text
			after_range.setEndPoint("StartToEnd", selection_range); // Moves the start where we need it

			var before_finished = false, selection_finished = false, after_finished = false;
			var before_text, untrimmed_before_text, selection_text, untrimmed_selection_text, after_text, untrimmed_after_text;

			// Load the text values we need to compare
			before_text = untrimmed_before_text = before_range.text;
			selection_text = untrimmed_selection_text = selection_range.text;
			after_text = untrimmed_after_text = after_range.text;

			// Check each range for trimmed newlines by shrinking the range by 1 character and seeing
			// if the text property has changed. If it has not changed then we know that IE has trimmed
			// a \r\n from the end.
			do {
				if (!before_finished) {
					if (before_range.compareEndPoints("StartToEnd", before_range) == 0) {
						before_finished = true;
					} else {
						before_range.moveEnd("character", -1)
						if (before_range.text == before_text) {
							untrimmed_before_text += "\r\n";
						} else {
							before_finished = true;
						}
					}
				}
				if (!selection_finished) {
					if (selection_range.compareEndPoints("StartToEnd", selection_range) == 0) {
						selection_finished = true;
					} else {
						selection_range.moveEnd("character", -1)
						if (selection_range.text == selection_text) {
							untrimmed_selection_text += "\r\n";
						} else {
							selection_finished = true;
						}
					}
				}
				if (!after_finished) {
					if (after_range.compareEndPoints("StartToEnd", after_range) == 0) {
						after_finished = true;
					} else {
						after_range.moveEnd("character", -1)
						if (after_range.text == after_text) {
							untrimmed_after_text += "\r\n";
						} else {
							after_finished = true;
						}
					}
				}

				} while ((!before_finished || !selection_finished || !after_finished));

				// Untrimmed success test to make sure our results match what is actually in the textarea
				// This can be removed once you're confident it's working correctly
				var untrimmed_text = untrimmed_before_text + untrimmed_selection_text + untrimmed_after_text;
				var untrimmed_successful = false;
				if (textarea.value == untrimmed_text) {
					untrimmed_successful = true;
				}
				// ** END Untrimmed success test

				var startPoint = untrimmed_before_text.length;
				originalSelPoint = startPoint;

			}
		}
		return originalSelPoint;
	}

function rhymeWord(node, charClicked) {
	if(charClicked>0){
		allText = node.value;
		allText = allText.replace('>','');
   		allText = allText.replace('<','');
		afterCharClicked = allText.substring(charClicked);
		beforeCharClicked = allText.substring(0,charClicked);	
		afterWords = afterCharClicked.split(/[^\w\d-']+/g);
		beforeWords = beforeCharClicked.split(/[^\w\d-']+/g);
		theWordStartingChar = charClicked - beforeWords[beforeWords.length-1].length;
		theWordEndingChar = charClicked + afterWords[0].length-1;
		theWord = beforeWords[beforeWords.length-1] + afterWords[0];
		theWord = theWord.replace(/[^\w]/g,'');
		if(theWord.length>0){
			// Move word list box
			cursorY = tempY-domOffsetTop(node)-10;
			if(cursorY<17) { cursorY=17; }
			document.getElementById('middlecolumn').style.backgroundPosition = '0px '+cursorY+'px';			
			modifiedText = allText.substring(0,theWordStartingChar)+'>'+theWord+'<'+allText.substring(theWordEndingChar+1);
			node.value = modifiedText;
			get(theWord);
		}
	}
	if (savedCursorPosition>theWordStartingChar) {
		setCursorPosition(node, savedCursorPosition+2);
	}else{
		setCursorPosition(node, savedCursorPosition);	}
}

function processClick(node, e) {
	savedScroll = node.scrollTop;
	if(e.altKey==true){
		rhymeWord(node, getCursorPosition(node));
	}else{
		savedCursorPosition = getCursorPosition(node);
	}
	node.scrollTop = savedScroll;
}

function processKeyUp(node,e) {	
	savedScroll = node.scrollTop;
	modifierKeys = new Array(16,17,18,19,37,38,39,40,224);
	selectAll = justPressedControl && e.keyCode == 65;
	if(selectAll) node.select();
	if((modifierKeys.indexOf(e.keyCode)<0) && !selectAll) {
	    document.getElementById('myspan').innerHTML = '';
	    document.getElementById('wordlist').style.display = 'none';
	    clearHighlight(node);
	}
	node = document.rhymeText.rhyme;
	savedCursorPosition = getCursorPosition(node);
	node.scrollTop = savedScroll;
	justPressedControl = false;
	if((e.keyCode==17)||(e.keyCode==224)) justPressedControl = true;
}

function insertWord(word) {
	savedScroll = node.scrollTop;
	node = document.rhymeText.rhyme;
	if((node.value[savedCursorPosition-1] != ' ')&&(node.value[savedCursorPosition-1] != '\n')) word = ' '+word;
	if(node.value[savedCursorPosition] != ' ')word = word + ' ';
	node.value = node.value.substring(0, savedCursorPosition)+ word+ node.value.substring(savedCursorPosition, node.value.length);
	savedCursorPosition = savedCursorPosition + word.length;
	setCursorPosition(node,savedCursorPosition);
    document.getElementById('myspan').innerHTML = '';
	document.getElementById('wordlist').style.display = 'none';
    clearHighlight(node);
	node.scrollTop = savedScroll;
}

function clearHighlight(node) {
	savedCursorPosition = getCursorPosition(node);
	if(savedCursorPosition>node.value.indexOf('>')&&node.value.indexOf('>')>0) savedCursorPosition -= 2;
    node.value = node.value.replace('>','');
    node.value = node.value.replace('<','');
    setCursorPosition(node,savedCursorPosition);
}

function nToBr(theString) {
	theString = escape(theString);
	theString = theString.replace(/%0A/g,"%3Cbr%3E");
	theString = unescape(theString);
	return theString;
}

//
//-----------------> TOOLBAR BUTTONS
//

function copyToClipboard() {
  inElement = document.getElementById('rhyme');
  if (inElement.createTextRange) {
    var range = inElement.createTextRange();
    if (range && BodyLoaded==1)
     range.execCommand('Copy');
  } else {
    var flashcopier = 'flashcopier';
    if(!document.getElementById(flashcopier)) {
      var divholder = document.createElement('div');
      divholder.id = flashcopier;
      document.body.appendChild(divholder);
    }
    document.getElementById(flashcopier).innerHTML = '';
    var divinfo = '<embed src="_clipboard.swf" FlashVars="clipboard='+escape(inElement.value)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
    document.getElementById(flashcopier).innerHTML = divinfo;
  }
}

function save() {
	document.saveForm.saveText.value = document.getElementById('rhyme').value;
	document.saveForm.submit();
}

function printText() {
	document.getElementById('printContainer').innerHTML = nToBr(document.getElementById('rhyme').value);
	window.print();
}

//
//-----------------> TRACK CURSOR
//

var IE = document.all?true:false;
if (!IE) document.captureEvents(Event.MOUSEMOVE)
document.onmousemove = getMouseXY;
var tempX = 0;
var tempY = 0;
function getMouseXY(e) {
if (IE) { // grab the x-y pos.s if browser is IE
tempX = event.clientX + document.body.scrollLeft;
tempY = event.clientY + document.body.scrollTop;
}
else {  // grab the x-y pos.s if browser is not IE
tempX = e.pageX;
tempY = e.pageY;
}  
if (tempX < 0){tempX = 0;}
if (tempY < 0){tempY = 0;}  
/*
document.Show.MouseX.value = tempX;
document.Show.MouseY.value = tempY;
*/
return true;
}

