﻿$(document).ready(function() {
   $('input.ow-numbers').each(function() {
      $(this).ow_numbers();
   });

   $('input.ow-dates').ow_dates();
   $('input.ow-hours').ow_hours();

   if ($.validator) {
      $.validator.addMethod('owRange', function(value, element, param) {
         if (param[2] != null)
         // ThousandSeparator
            value = value.replace(param[2], '');
         if (param[3] != null)
            value = value.replace(param[3], '.');
         return this.optional(element) || (value >= param[0] && value <= param[1]);
      }, jQuery.validator.messages['owRange']);

      $.validator.addMethod('dateITA', function(value, element) {
         var validDate = false;
         //var regularExpression = /^\d{1,2}\/\d{1,2}\/\d{4}$/
         var separator = value.substr(2, 1);
         //if (value.length > 2)
            //separator = value.substr(2,1);
         //var regularExpression = new RegExp("^\d{1,2}\/\d{1,2}\/\d{4}$".replace('/', separator));
         //if (regularExpression.test(value)) {
            //var slitDate = value.split('/');
            var slitDate = value.split(separator);
            var dd = parseInt(slitDate[0], 10);
            var mm = parseInt(slitDate[1], 10);
            var yyyy = parseInt(slitDate[2], 10);
            var newDate = new Date(yyyy, mm - 1, dd);
            if ((newDate.getFullYear() == yyyy) && (newDate.getMonth() == mm - 1))
               //validDate = true;
               validDate = yyyy > 1754;
            //}
         return this.optional(element) || validDate;
      }, jQuery.validator.messages['dateITA']);

      $.validator.addMethod('dateEN', function(value, element) {
         var validDate = false;
         var separator = value.substr(2, 1);
         //var regularExpression = /^\d{1,2}\/\d{1,2}\/\d{4}$/
         //if (regularExpression.test(value)) {
            //var slitDate = value.split('/');
            var slitDate = value.split(separator);
            var mm = parseInt(slitDate[0], 10);
            var dd = parseInt(slitDate[1], 10);
            var yyyy = parseInt(slitDate[2], 10);
            var newDate = new Date(yyyy, mm - 1, dd);
            if ((newDate.getFullYear() == yyyy) && (newDate.getMonth() == mm - 1))
               //validDate = true;
               validDate = yyyy>1754;
         //}
         return this.optional(element) || validDate;
      }, jQuery.validator.messages['dateEN']);

      $.validator.addMethod('hourValid', function(value, element) {
         var validHour = false;
         switch (value.length) {
            case 0:
               validHour = true;
               break;
            case 5:
               validHour = true;
               var hh = value.substr(0, 2);
               var mm = value.substr(3, 2);
               if (!((hh >= '00' && hh <= '23') && (mm >= '00' && mm <= '59'))) {
                  validHour = false;
               }
               break;
         }
         return this.optional(element) || validHour;
      }, jQuery.validator.messages['hourValid']);

   }
})



// Variabili globali. Rappresentano i parametri passati dal metadati
var integerDigits, decimalDigits, decimalPoint, thousandSeparator, allowBlank, allowNegative;

jQuery.fn.ow_numbers = function() {

   this.keydown(function(e) {
      integerDigits = 3;
      decimalDigits = 0;
      decimalPoint = ',';
      thousandSeparator = '.';
      allowBlank = false;
      allowNegative = false;

      // Se c'è il plugin metadata
      if (jQuery.metadata) {
         // estraggo i metadati dall'elemento corrente
         var meta = $(this).metadata()['ow_numbers_md'];
         if (meta) {
            if (meta.integerDigits)
               integerDigits = meta.integerDigits;
            if (meta.decimalDigits)
               decimalDigits = meta.decimalDigits;
            if (meta.decimalPoint)
               decimalPoint = meta.decimalPoint;
            if (meta.thousandSeparator || meta.thousandSeparator == 'null') {
               thousandSeparator = meta.thousandSeparator;
               thousandSeparator = thousandSeparator.replace(' ', '');
            }
            if (meta.allowBlank)
               allowBlank = meta.allowBlank;
            if (meta.allowNegative)
               allowNegative = meta.allowNegative;
         }
         decimalPoint = decimalDigits == 0 ? '' : decimalPoint;
         thousandSeparator = thousandSeparator == 'null' || integerDigits < 4 ? '' : thousandSeparator;
      }
      // Caratteri permessi 
      var keyCode = KeyCodeForNumericKeyboard(e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0);

      var numberVal = $(this).val();
      var SelectionStart = GetSelectionStart(this);
      var SelectionEnd = GetSelectionEnd(this);
      var digitPressed = String.fromCharCode(keyCode);
      var leftWord = numberVal.substr(0, SelectionStart);
      var rightWord = numberVal.substr(SelectionEnd);
      var selectionStartInDecimalPart = decimalDigits > 0 && (SelectionStart > numberVal.length - decimalDigits - 1);
      var newNumber;

      if (e.ctrlKey) {
         // Ctrl+A
         if ((keyCode == 97 /* firefox */) || (keyCode == 65) /* opera */) return true;
         // Ctrl+X (cut)
         if ((keyCode == 120 /* firefox */) || (keyCode == 88) /* opera */) return true;
         // Ctrl+C (copy)
         if ((keyCode == 99 /* firefox */) || (keyCode == 67) /* opera */) return true;
         // Ctrl+Z (undo)
         if ((keyCode == 122 /* firefox */) || (keyCode == 90) /* opera */) return true;
         // allow or deny Ctrl+V (paste), Shift+Ins
         if ((keyCode == 118 /* firefox */) || (keyCode == 86) /* opera */ || (keyCode == 45)) {
            if (window.clipboardData) {
               var clipboardText = window.clipboardData.getData('Text');
               newNumber = leftWord + clipboardText + numberVal.substr(SelectionEnd);
               newNumber = RecreateStyle(newNumber);
               $(this).attr('value', newNumber);
               return false;
            }
            return true;
         }
      }
      if ((keyCode == 188 && decimalPoint == ',') || ((keyCode == 110 || keyCode == 190) && decimalPoint != '')) {
         SelectionStart = DecimalPointPosition(numberVal) + 1;
         SetNumberSelectionRange(this, SelectionStart);
         return false;
      }
      if (keyCode == 8) {
         // Backspace
         var caracterToDelete = '';
         newNumber = RecreateStyle(leftWord.substr(0, SelectionStart) + numberVal.substr(SelectionEnd));
         if (SelectionStart == SelectionEnd) {
            caracterToDelete = leftWord.substr(leftWord.length - 1, 1);
            newNumber = RecreateStyle(leftWord.substr(0, SelectionStart - 1) + rightWord);
         }
         if (caracterToDelete == decimalPoint) {
            SelectionStart = DecimalPointPosition(numberVal);
            SetNumberSelectionRange(this, SelectionStart);

         } else {
            $(this).attr('value', newNumber);
            if (selectionStartInDecimalPart) {
               SelectionStart = SelectionStart - 1;
               SetNumberSelectionRange(this, SelectionStart);
            } else {
               SelectionStart = DecimalPointPosition(newNumber);
               SetNumberSelectionRange(this, SelectionStart);
            }
         }
         return false;
      }
      if (keyCode == 61 || keyCode == 107 || keyCode == 187) {
         // +
         if (numberVal.substr(0, 1) == '-') {
            newNumber = RecreateStyle(numberVal.substr(1));
            $(this).attr('value', newNumber);
            SelectionStart = DecimalPointPosition(newNumber);
            SetNumberSelectionRange(this, SelectionStart);
         }
         return false;
      }
      if ((keyCode == 109 || keyCode == 189) && allowNegative) {
         // -
         if (numberVal.substr(0, 1) != '-') {
            newNumber = RecreateStyle('-' + numberVal);
            $(this).attr('value', newNumber);
            SelectionStart = DecimalPointPosition(newNumber);
            SetNumberSelectionRange(this, SelectionStart);
         }
         return false;
      }
      if (keyCode == 46) {
         // Canc
         if (selectionStartInDecimalPart) {
            newNumber = RecreateStyle(leftWord + rightWord.substr(1));
            $(this).attr('value', newNumber);
            SetNumberSelectionRange(this, SelectionStart);
         } else {
            var selectionStart = SelectionStart == SelectionEnd ? SelectionStart - 1 : SelectionStart;
            newNumber = RecreateStyle(leftWord.substr(0, selectionStart) + rightWord);
            $(this).attr('value', newNumber);
            SelectionStart = DecimalPointPosition(newNumber);
            SetNumberSelectionRange(this, SelectionStart);
         }
         return false;
      }
      if (keyCode >= 48 && keyCode <= 57) {
         // digits
         if (SelectionStart == 0 && SelectionEnd == numberVal.length) {
            // Selezione di tutto il numero
            $(this).attr('value', RecreateStyle(digitPressed));
            SetNumberSelectionRange(this, 1);
         }
         if (selectionStartInDecimalPart) {
            newNumber = leftWord + digitPressed + rightWord.substr(1);
            $(this).attr('value', RecreateStyle(newNumber));
            SelectionStart++;
            SetNumberSelectionRange(this, SelectionStart);
            return false;
         } else {
            newNumber = RecreateStyle(leftWord + digitPressed + rightWord);
            if (TotalDigit(newNumber) <= integerDigits + decimalDigits) {
               $(this).attr('value', newNumber);
               SelectionStart = DecimalPointPosition(newNumber);
               SetNumberSelectionRange(this, SelectionStart);
            }
         }
         return false;
      }
      if (keyCode > 39)
         return false;

      return true;
   })
   return this;
}



function RecreateStyle(stringNumber) {
   return recreateStyleNumber(stringNumber, decimalDigits, decimalPoint, thousandSeparator, allowBlank, allowNegative);
}



function recreateStyleNumber(stringNumber, decimalDigits, decimalPoint, thousandSeparator, allowBlank, allowNegative) {
   if (stringNumber=='' && allowBlank)
      return '';
   var stringReturn = '';
   if (decimalDigits>0) {
      decimalPointPosition = stringNumber.lastIndexOf(decimalPoint);
      if (decimalPointPosition == -1) {
         // Aggiunge tutte le cifre decimali
         stringReturn = decimalPoint + StrLength('0',decimalDigits);
      } else {
         // Prende le prime decimali ed eventualmente aggiunge 0 in coda
         stringReturn = (stringNumber + StrLength('0',decimalDigits)).substr(decimalPointPosition, decimalDigits+1);
      }
   }
   var totalIntegerDigit = 0;
   var decimalDigits2 = stringNumber.lastIndexOf(decimalPoint);
   decimalDigits2 = decimalDigits2==-1 ? 0 : stringNumber.length-decimalDigits2;
   for (i=stringNumber.length-decimalDigits2-1; i>=0; i--) {
      if (stringNumber.substr(i,1)>='0' && stringNumber.substr(i,1)<='9') {
         totalIntegerDigit++;
         stringReturn = stringNumber.substr(i,1)+stringReturn
         if (totalIntegerDigit%3==0) stringReturn = thousandSeparator+stringReturn;
      }
   }
   stringReturn = (stringReturn.substr(0,1)==thousandSeparator ? stringReturn.substr(thousandSeparator.length) : stringReturn);
   if (totalIntegerDigit==0)
      // Se il numero non ha specificato una parte intera, forza uno zero iniziale
      stringReturn='0'+stringReturn;
   else {
      if (stringReturn.substr(0,1)==0 && totalIntegerDigit>1)
         // Non consente che un numero inizi con doppio 0 (0012 -->12 non consentito)
         stringReturn=stringReturn.substr(1);
   }   
   stringReturn = ((stringNumber.substr(0,1)=='-' && allowNegative) ? '-' : '')+stringReturn;
   return stringReturn;
};



function DecimalPointPosition(stringNumber) {
   var ret = stringNumber.lastIndexOf(decimalPoint);
   return ret==-1 ? stringNumber.length : ret;
};



function TotalDigit(stringNumber) {
   var totalDigit = 0;
   for (i=0; i<stringNumber.length; i++) {
      if (stringNumber.substr(i,1)>='0' && stringNumber.substr(i,1)<='9')
         totalDigit++;
   }
   return totalDigit;
};


function SetNumberSelectionRange(input, startPosition) {
   // Se l'intero vale zero lo seleziona
   var endPosition = startPosition;
   var inputValue = input.value;
   var integerPart = inputValue.substr(0,startPosition);
   var decPoint = inputValue.substr(startPosition,1);
   if (decPoint==decimalPoint || decPoint=='') {
      if (integerPart=='-0' || integerPart=='0') {
         startPosition--;
      }
   }
   SetSelectionRange(input, startPosition, endPosition);
   return;
};



function StrLength(character, n) {
   var ret = '';
   for (i=0; i<n; i++)
      ret += character;
   return ret;
}

//
// INPUT CONTROLLATO PER DATE
//
jQuery.fn.ow_dates = function() {
	this.keydown(function (e) {
      var dateSeparator = '/';
      
      // Se c'è il plugin metadata
      if (jQuery.metadata) {
         // estraggo i metadati dall'elemento corrente
         var meta = $(this).metadata()['ow_dates_md'];
         if (meta) {
            if (meta.dateSeparator)
               dateSeparator = meta.dateSeparator;
        }    
      }
	   // Caratteri permessi 

	   var keyCode = KeyCodeForNumericKeyboard(e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0);
      var dateVal = $(this).val();
      var SelectionStart = GetSelectionStart(this);
      var SelectionEnd = GetSelectionEnd(this);
      var digitPressed = String.fromCharCode(keyCode);
      var leftWord = dateVal.substr(0, SelectionStart);
	   
	   if(e.ctrlKey) {
	      // Ctrl+A
         if((keyCode ==  97 /* firefox */) || (keyCode == 65) /* opera */) return true;
         // Ctrl+X (cut)
         if((keyCode == 120 /* firefox */) || (keyCode == 88) /* opera */) return true;
         // Ctrl+C (copy)
         if((keyCode ==  99 /* firefox */) || (keyCode == 67) /* opera */) return true;
         // Ctrl+Z (undo)
         if((keyCode == 122 /* firefox */) || (keyCode == 90) /* opera */) return true;
         // allow or deny Ctrl+V (paste), Shift+Ins
         if((keyCode == 118 /* firefox */) || (keyCode == 86) /* opera */ || (keyCode == 45)) {
            if (window.clipboardData) {
               var clipboardText = window.clipboardData.getData('Text');
               newNumber = leftWord+clipboardText+dateVal.substr(SelectionEnd);
               newNumber = RecreateStyle(newNumber);
              $(this).attr('value',newNumber);
              return false;
             }   
             return true;
         }    
      }
        
      if ((keyCode>39 && keyCode<46) || keyCode>57 || keyCode==32) 
         return false;

      if (keyCode==8) {
         // Backspace
         if (SelectionEnd!=dateVal.length)
            return false;
         if (SelectionStart==SelectionEnd && (SelectionStart==4 || SelectionEnd==7)) {
            // Toglie anche la barra (/)
            $(this).attr('value', dateVal.substr(0, SelectionEnd-2));
            return false;
         }   
      }
      if (keyCode==9) {
         // Tab
         if (dateVal.length==8)
	         $(this).attr('value',dateVal.substr(0,6)+'20'+dateVal.substr(6));
      }
      if (keyCode==46) {
         // Canc
         if (SelectionEnd!=dateVal.length)
            return false;
      }
      if (keyCode>=48 && keyCode<=57) {
         // Digits
         if (SelectionStart>9)
            return false;
         if ((SelectionEnd-SelectionStart==1 && SelectionStart!=2 && SelectionStart!=5)) {
            // Consento di modificare un singolo carattere
            $(this).attr('value',leftWord+digitPressed+dateVal.substr(SelectionEnd));
            SelectionStart++;
            SetSelectionRange(this, SelectionStart, SelectionStart);
            return false;
         }
         if ((SelectionStart!=SelectionEnd && SelectionEnd!=dateVal.length))
            return false;
         if (SelectionStart==2 || SelectionStart==5) {
            if (SelectionStart==leftWord.length)
               $(this).attr('value',leftWord+dateSeparator+digitPressed);
            return false;
         }   
         if (SelectionEnd==dateVal.length) {
            if (SelectionStart==1 || SelectionStart==4) {
               $(this).attr('value',leftWord+digitPressed+dateSeparator);
            } else {
               $(this).attr('value',leftWord+digitPressed);
            }
         } else {
            $(this).attr('value',leftWord+digitPressed+dateVal.substr(SelectionEnd+1));
            SelectionStart++;
            SelectionStart = SelectionStart==2 || SelectionStart==5 ? SelectionStart+1 : SelectionStart;
            SetSelectionRange(this, SelectionStart, SelectionStart);
         }
         return false;
      }

      return true;
   })   
   return this;
}

//
// INPUT CONTROLLATO PER ORE
//
jQuery.fn.ow_hours = function() {
    this.keydown(function(e) {
        var hourSeparator = ':';

        // Se c'è il plugin metadata
        if (jQuery.metadata) {
            // estraggo i metadati dall'elemento corrente
            var meta = $(this).metadata()['ow_hours_md'];
            if (meta) {
                if (meta.hourSeparator)
                    hourSeparator = meta.hourSeparator;
            }
        }
        // Caratteri permessi 

        var keyCode = KeyCodeForNumericKeyboard(e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0);
        var hourVal = $(this).val();
        var SelectionStart = GetSelectionStart(this);
        var SelectionEnd = GetSelectionEnd(this);
        var digitPressed = String.fromCharCode(keyCode);
        var leftWord = hourVal.substr(0, SelectionStart);

        if (e.ctrlKey) {
            // Ctrl+A
            if ((keyCode == 97 /* firefox */) || (keyCode == 65) /* opera */) return true;
            // Ctrl+X (cut)
            if ((keyCode == 120 /* firefox */) || (keyCode == 88) /* opera */) return true;
            // Ctrl+C (copy)
            if ((keyCode == 99 /* firefox */) || (keyCode == 67) /* opera */) return true;
            // Ctrl+Z (undo)
            if ((keyCode == 122 /* firefox */) || (keyCode == 90) /* opera */) return true;
            // allow or deny Ctrl+V (paste), Shift+Ins
            if ((keyCode == 118 /* firefox */) || (keyCode == 86) /* opera */ || (keyCode == 45)) {
                if (window.clipboardData) {
                    var clipboardText = window.clipboardData.getData('Text');
                    newNumber = leftWord + clipboardText + hourVal.substr(SelectionEnd);
                    newNumber = RecreateStyle(newNumber);
                    $(this).attr('value', newNumber);
                    return false;
                }
                return true;
            }
        }

        if ((keyCode > 39 && keyCode < 46) || keyCode > 57 || keyCode == 32)
            return false;

        if (keyCode == 8) {
            // Backspace
            if (SelectionEnd != hourVal.length)
                return false;
            if (SelectionStart == SelectionEnd && SelectionStart == 4) {
                // Toglie anche la barra (/)
                $(this).attr('value', hourVal.substr(0, SelectionEnd - 2));
                return false;
            }
        }
        if (keyCode == 9) {
            // Tab
            if (hourVal.length == 3)
                $(this).attr('value', hourVal + "00");
            if (hourVal.length == 1)
                $(this).attr('value', "0" + hourVal + hourSeparator + "00");
        }
        if (keyCode == 46) {
            // Canc
            if (SelectionEnd != hourVal.length)
                return false;
        }
        if (keyCode >= 48 && keyCode <= 57) {
            // Digits
            if (SelectionStart > 4)
                return false;
            if ((SelectionEnd - SelectionStart == 1 && SelectionStart != 2)) {
                // Consento di modificare un singolo carattere
                $(this).attr('value', leftWord + digitPressed + hourVal.substr(SelectionEnd));
                SelectionStart++;
                SetSelectionRange(this, SelectionStart, SelectionStart);
                return false;
            }
            if ((SelectionStart != SelectionEnd && SelectionEnd != hourVal.length))
                return false;
            if (SelectionStart == 2) {
                if (SelectionStart == leftWord.length)
                    $(this).attr('value', leftWord + hourSeparator + digitPressed);
                return false;
            }
            if (SelectionEnd == hourVal.length) {
                if (SelectionStart == 1) {
                    $(this).attr('value', leftWord + digitPressed + hourSeparator);
                } else {
                    $(this).attr('value', leftWord + digitPressed);
                }
            } else {
                $(this).attr('value', leftWord + digitPressed + hourVal.substr(SelectionEnd + 1));
                SelectionStart++;
                SelectionStart = SelectionStart == 2 ? SelectionStart + 1 : SelectionStart;
                SetSelectionRange(this, SelectionStart, SelectionStart);
            }
            return false;
        }

        return true;
    })
    return this;
}

//
// Funzioni comuni
//

// Funzioni per selettori IE e Firefox
function SetSelectionRange(input, startPosition, endPosition) {
   if ($.browser.mozilla || $.browser.safari) {
      input.setSelectionRange(startPosition, endPosition);
   } else {
      var range = input.createTextRange();
      range.collapse(true);
      range.moveStart('character', startPosition);
      range.moveEnd('character', 0);
      range.select();
   }
   return;
};

function GetSelectionStart(input) {
   if ($.browser.mozilla || $.browser.safari)
      return input.selectionStart;
   var range = document.selection.createRange();
   var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
   if (!isCollapsed)
      range.collapse(true);

   return Math.abs(document.selection.createRange().moveStart("character", -1000000));
};



function GetSelectionEnd(input) {
   if ($.browser.mozilla || $.browser.safari)
      return input.selectionEnd;
   var range = document.selection.createRange();
   var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
   if (!isCollapsed)
      range.collapse(false);
      
   return Math.abs(document.selection.createRange().moveEnd("character", -1000000)); 
};



function KeyCodeForNumericKeyboard(keyCode) {
   // I numeri del tastierino numerico li converte in numeri normali della tastiera
   return (keyCode>=96 && keyCode<=105) ? keyCode-48 : keyCode;
};
