/*Prefill textArea with chosen dropdown option*/
function populateTxt(listId, txtAreaId){
	var txtnode ="";
	txtnode = document.getElementById(listId).value;
	if(txtnode != 0 || txtnode != null){
		document.getElementById(txtAreaId).value = txtnode;
	}
}

var mDownTextAreaContent = '';

var version = 0;

var versionPointer = 0;

mDownTextAreaVersions = [];

function setMDownTextAreaContent (textArea) {
	mDownTextAreaContent = textArea.value;
	
	mDownTextAreaVersions[version] = textArea.value;
	
	version++;
	versionPointer = version;
}

function validateCounter(textArea, maxChars, maxLines, maxPerLine)
{
	var posStart = getSelectionStart(textArea);
	var posEnd = getSelectionEnd(textArea);
	var textAreaContent = textArea.value;
	/* if (textAreaContent.match(/[^\r]\n\n/gi) != null)
	{
		//alert('foo');
	} */
	var webkitAvailable = false;
	if (textAreaContent.match(/[^\r]\n/gi) != null)
	{
		//alert('bar');
		textAreaContent = textAreaContent.replace(/\n+/gi, "\r\n");
		textArea.value = textAreaContent;
		webkitAvailable = true;
	}
	
	var allChars = textAreaContent.split('');
	
	// 1. Validate maxChars
	var charsWithoutNewLines = allChars;
	
	for (var i = 0; i < charsWithoutNewLines.length; i++)
	{
		if (charsWithoutNewLines[i] == "\n")
		{
			charsWithoutNewLines.splice(i, 1);
		}
		if (charsWithoutNewLines[i] == "\r")
		{
			charsWithoutNewLines.splice(i, 1);
		}
	}
	
	if (charsWithoutNewLines.length > maxChars)
	{
		versionPointer--;
		textArea.value = mDownTextAreaVersions[versionPointer];
		validateCounter(textArea, maxChars, maxLines, maxPerLine);
		return;
	}
	
	// 2. Validate maxPerLine
	var allLines = textAreaContent.split("\r\n");
	for (var i = 0; i < allLines.length; i++)
	{
		var charsInLine = allLines[i].split('');
		
		if (charsInLine.length > maxPerLine && charsInLine[charsInLine.length - 1] != "\n" && charsInLine[charsInLine.length - 1] != "\r")
		{
			versionPointer--;
			textArea.value = mDownTextAreaVersions[versionPointer];
			validateCounter(textArea, maxChars, maxLines, maxPerLine);
			return;
		}
	}

	// 3. Validate maxLines	
	var allLines = textAreaContent.split("\r\n");
	if (allLines.length > maxLines)
	{
		versionPointer--;
		textArea.value = mDownTextAreaVersions[versionPointer];
		validateCounter(textArea, maxChars, maxLines, maxPerLine);
		return;
	}
	setSelectionRange(textArea, posStart, posEnd);
}
 
/* this function checks, that the giftmessage doesn't exceed the settings for it's size */
function textCounter(theField,maxChars,maxLines,maxPerLine)
{

	var strTemp = "";
	var strLineCounter = 0;
	var strCharCounter = 0;
	var strTheField = theField.value.replace(/\r/g, "");
	var originalLength = theField.value.length; 
	var strLastSpace = 0;
	var posStart = getSelectionStart(theField);
	var posEnd = getSelectionEnd(theField);
	var scrollTop = theField.scrollTop;
	var newCRs = 0;
	
	for (var i = 0; i < strTheField.length; i++)
	{
		var strChar = strTheField.substring(i, i + 1);
		if(strChar == " "){
			strLastSpace = i + 1;
		}
		if (strChar == '\n')
		{
			if (strLineCounter == maxLines -1)
			{
				break;
			}
			strTemp += strChar;
			strCharCounter = 0;
			strLineCounter += 1;
		}

		else if (strCharCounter == maxPerLine)
		{
			if (strLineCounter == maxLines -1)
			{
				break;
			}
			if (isNaN(strLastSpace) || strLastSpace==strLineCounter*(maxPerLine+1)-1 || strLastSpace==0) strLastSpace = (strLineCounter+1)*maxPerLine + strLineCounter;

			if (strTemp.substr(strLastSpace, 1)=='\n' || strTemp.substr(strLastSpace, 1)==' ')
				strTemp = strTemp.substr(0, strLastSpace) + '\n' + strTemp.substr(strLastSpace+1)
			else
				strTemp = strTemp.substr(0, strLastSpace) + '\n' + strTemp.substr(strLastSpace);

			newCRs++;
			if (strChar != " ")
			{
				strTemp = strTemp + strChar;
			}
			strCharCounter = 0;
			strLineCounter += 1;
		}
		else
		{
			strTemp += strChar;
			strCharCounter ++;
		}
		if (strTemp.length - strLineCounter >= maxChars)
		{
			break;
		}
	}
	theField.value = strTemp;
	if (window.opera) newCRs = newCRs * 2;
	setSelectionRange(theField, posStart+newCRs , posEnd +newCRs);
	theField.scrollTop = scrollTop;
}

/* functions for maintaining carret position */
function setSelectionRange(input, start, end) {
    if (input.setSelectionRange) {
        input.setSelectionRange(start, end);
    }
    if (input.createTextRange) {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveStart("character", start);
        range.moveEnd("character", end - start);
        range.select();
    }
}

function getSelectionStart(input) {
    if (input.selectionStart)
        return input.selectionStart;
    if (input.createTextRange) {
        var elementOffset = calcBookmark(input.createTextRange().duplicate().getBookmark());
        var range = document.selection.createRange().duplicate();
        var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
        if (!isCollapsed)
            range.collapse(true);
        cursorPos = calcBookmark(range.getBookmark()) - elementOffset;

        if (cursorPos < 0) cursorPos = 0;
        if (cursorPos > input.value.length) cursorPos = input.value.length;
        return cursorPos;
    }
    return 0;
}

function getSelectionEnd(input) {
    if (input.selectionEnd)
        return input.selectionEnd;
    if (input.createTextRange) {
        var elementOffset = calcBookmark(input.createTextRange().duplicate().getBookmark());
        var range = document.selection.createRange().duplicate();
        var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
        if (!isCollapsed)
            range.collapse(false);
        cursorPos = calcBookmark(range.getBookmark()) - elementOffset;

        if (cursorPos < 0) cursorPos = 0;
        if (cursorPos > input.value.length) cursorPos = input.value.length;
        return cursorPos;
    }
    return 0;
}

function calcBookmark(bk) {
    return (bk.charCodeAt(0) - 1) + (bk.charCodeAt(3) - 1) * 65536 + (bk.charCodeAt(2) - 1);
}
