﻿/**************************************************************************
Script:	jPart.TextCounter.js
Author:	SharejPoint.com
Purpose: Simple text counter
Dependencies:
	jPointLoader.js has to be on the same page or form editor webpart
*************************************************************************/
//Start Webpart logic code ----------------------------------- 
	
myjPart.ShowConfigDefaults = [	
	["ID","Unique identifier","jPartTextCounter"]
    ,["FieldName","Form field name to count characters","Title"]
    ,["MaxLength","Max limit of text input","140"]
    ,["Direction","Count down or up (up/down)","down"]
    ,["StopOnMaxLength","Stop data input when max length is reached. (yes/no)","yes"]
    ,["ShowCounter","Display counter","yes"]
    ,["SiteURL","Site URL of list (optional)",""]
    ,["ListName","List name when current form does not match current list (optional)",""]
	];
	
myjPart.setjPartOptions({Plugin:{
		Name:'jPartTextCounter'
		, Version:'2.0'
		, Origin:'SharejPoint'
		, Description:'Text field character counter.  '
		, Developer:'Ken Le'
	}});

//Start Webpart logic code ----------------------------------- 
$(document).ready(function() { //Wait page to load and then apply webpart logic
	if(myjParts[JpartProcessing] != null)
	{
		var thisWebpart = myjParts[JpartProcessing];
		try
		{
			//jPart user code goes here ---------------------------
			if(thisWebpart.Options.Local != null)
			{
				var thisOpt = thisWebpart.Options.Local;				
				var iMaxLength = parseInt(thisOpt.MaxLength);
				var countingDown = thisOpt.Direction.toLowerCase() == "down";
				var bMaxLenStop = thisOpt.StopOnMaxLength == "yes";
	
				//Initialize form
				if (thisOpt.SiteURL != "" && thisOpt.ListName)
					jP.Form.readForm(thisOpt.SiteURL, thisOpt.ListName);
				else
					jP.Form.readForm();
	
				//Added div to display counter
				var counterDivId = thisOpt.FieldName+"_counter";
				var fieldspan = $(jP.Form[thisOpt.FieldName].Item);
				var labelCell = $(jP.Form[thisOpt.FieldName].ItemRow).find("td:first");
				labelCell.append("<div id='"+counterDivId+"' style='{color:gray;font-weight:bold}'/>");	//under field label
				
				//Set initial count
				if (thisOpt.Direction.toLowerCase() == "down")
					$("#"+counterDivId).html(iMaxLength);
				else
					$("#"+counterDivId).html("0");
				
				//Set keyup event. Note: note working for richtext field	
				var field = fieldspan.find("input,textarea");
				field.keyup(keyEventHandler);
			}							
			//-----------------------------------------------------
		}catch(err){};
		JpartProcessing = JpartProcessing + 1;
	}
	
	//keyevent
	function keyEventHandler(){
		var len = field.val().length;
		
		//chop of text if longer then max length
		if (bMaxLenStop && len > iMaxLength) {
			var pos = getCursorPosition(); //save caret position
			var val = field.val();
			field.val(val.substr(0, iMaxLength));
			setCursorPosition(pos); //restore caret position
			len = iMaxLength;
		}

		//set color
		if (countingDown) {
			len = iMaxLength - len;
			if (len < 0) $("#"+counterDivId).css({'color':'red'})
			else $("#"+counterDivId).css({'color':'gray'})
		}
		else {
			if  (len > iMaxLength) $("#"+counterDivId).css({'color':'red'})
			else $("#"+counterDivId).css({'color':'gray'})
		}
		
		//Update counter display
		$("#"+counterDivId).html(len);
	}
	//http://shawpnendu.blogspot.com/2009/03/javascript-how-to-setget-cursor.html
	function getCursorPosition() {
		var obj=field.get(0);
		var CurPos = 0;
		
		//FOR IE
		if (document.selection) {
			obj.focus();
			var Sel = document.selection.createRange();
			Sel.moveStart ('character', -obj.value.length);
			CurPos = Sel.text.length;
		}		
		// For Firefox
		else if (obj.selectionStart)
			CurPos = obj.selectionStart;
		return CurPos;
	}
	function setCursorPosition(pos) {
		var obj=field.get(0);
		
		//FOR IE
		if(obj.setSelectionRange) {
			obj.focus();
			obj.setSelectionRange(pos,pos);
		}		
		// For Firefox
		else if (obj.createTextRange) {
			var range = obj.createTextRange();
			range.collapse(true);
			range.moveEnd('character', pos);
			range.moveStart('character', pos);
			range.select();
		}
	}		
});
//End Webpart logic code -----------------------------------
