﻿function clsCharacterCounter(intCharLimit, objFormElement, blnIsCounterVisible)
 {
    var objCounter = this;
    objCounter.objFormElement = objFormElement;
    objCounter.objFormElement.spr = objCounter;
    
    objCounter.objFormElement.onkeydown = fncCountCharactersHandler;
    objCounter.objFormElement.onkeyup = fncCountCharactersHandler;
    objCounter.objFormElement.onmousemove = fncCountCharactersHandler;
    objCounter.objFormElement.onmouseout = fncCountCharactersHandler;
    objCounter.objFormElement.onmouseout = fncCountCharactersHandler;
    
    objCounter.intCharLimit = intCharLimit;
    objCounter.strLimitConfirmMessage = "You have reached the number of characters (" + objCounter.intCharLimit + ") allowed." 
    
    if(blnIsCounterVisible)
    { 
        objCounter.objCounterStatusContainer = document.createElement("div");
        
        objCounter.objCounterStatusContainer.setAttribute("id","CounterStatusContainer");
        if(objCounter.objFormElement.nextSibling)objCounter.objFormElement.parentNode.insertBefore(objCounter.objCounterStatusContainer,objCounter.objFormElement.nextSibling); 
        else objCounter.objFormElement.parentNode.appendChild(objCounter.objCounterStatusContainer);
        
        objCounter.objCounterStatusContainer.innerHTML = "<strong>Characters Used:</strong> <span id=\"CounterDisplay\"> 0  </span> | ";
        objCounter.objCounterStatusContainer.innerHTML += "<strong>Character Limit:</strong> <span id=\"LimitDisplay\">  </span>.";
        
        objCounter.objCounterDisplay = document.getElementById("CounterDisplay");
        objCounter.objLimitDisplay = document.getElementById("LimitDisplay");
        
        objCounter.objLimitDisplay.innerHTML = objCounter.intCharLimit;
    }
    
    function fncCountCharactersHandler(event)
    {
        var objCounter = this.spr;
        var intCharacterCount = objCounter.fncGetNumCharacters(this) + objCounter.fncGetNumSpaces(this);
        
        if(intCharacterCount > objCounter.intCharLimit)
        {
            var numSpaces = objCounter.fncGetNumSpaces(this);
            this.value = this.value.substr(0,objCounter.intCharLimit);
            if(objCounter.objFormElement.selectionEnd)
            {
                objCounter.objFormElement.focus();
                objCounter.objFormElement.setSelectionRange(this.value.length, objCounter.objFormElement.selectionEnd);
                if(objCounter.objFormElement.scrollTop)
                    objCounter.objFormElement.scrollTop = this.value.length;
            }
        }
        else
        {
            objCounter.fncSetObjCounterDisplay(intCharacterCount);
        }
    }
 }
 
 clsCharacterCounter.prototype.fncSetObjCounterDisplay = function(intCharacterCount)
 {
    var objCounter = this;
    objCounter.objCounterDisplay.innerHTML = intCharacterCount + " ";
 }
 
 clsCharacterCounter.prototype.fncGetNumCharacters = function(objFormElement)
 {
    var objCounter = this;
    var objFormElementText = objFormElement.value;
    objFormElementText = objFormElementText.replace(/\s/gi,"");
    return objFormElementText.length;
 }
 
 clsCharacterCounter.prototype.fncGetNumSpaces = function(objFormElement)
 {
    var objCounter = this;
    var objFormElementText = objFormElement.value;
    var strPattern = /\s/gi;
    var objTempArray = objFormElementText.match(strPattern);
    return objTempArray ? objTempArray.length : 0;
 }

