/**
 * Name: jquery_extensions.js
 * Author: thko
 * Description: Erweiter das JQuery-Framework um verschiedene Funktionaltäten.
 *
 * Date: 25.08.2010
 * Packed: <yes|no> <bei no - Name des Packers - Methode>
 * jQuery: yes
 * use CSS: ???
 */


/** Konfliktbehebung **/
//var $j = jQuery.noConflict();

jQuery.extend({
    /**
     * Serialisiert die Werte eines Arrays oder einer Map.
     * 
     * @param {Object} obj Array oder Map
     */
    serializeObject: function(obj) {		
      var ret = "";    
      // wandelt von einem Array in einen Querystring
      if (jQuery.isArrayM(obj)) {
        if (obj.length%2 == 0) {
          jQuery.each(obj, function(i, item) {
            ret += (i>1&&i%2==0 ? "&" : "") + (i%2==0 ? item+"=" : item);
          });
        }
      }
      // wandelt von einem Object in einen Querystring
      if(jQuery.isObject(obj)) {
        var counter = 0;
        for(var key in obj) {
          ret += (counter>0 ? "&":"") + key + "=" + obj[key];
          counter++;
        }
      }
      return ret;
    },
  
    /**
     * Prueft ob "obj" ein Array ist.
     *
     * @param {Object} obj
     */ 
    isArrayM: function(obj) {
      try {
        if(typeof(obj) == 'object') {
            if (obj.length){
              return true;
            }else {
              return jQuery.isObject(obj);
            }
        }
      }catch(ex) {
        return jQuery.isObject(obj);
      }
      return false;
    },
  
    /**
     * Prueft ob "obj" ein Object ist.
     * 
     * @param {Object} obj
     */
    isObject: function(obj) {
      try {
        if (obj.constructor && obj.constructor != "undefined") {
          if (obj.constructor.toString().toLowerCase().indexOf("object") >= 0) {
            return true;
          }
        }else {
          if(typeof(obj) == 'object') {
            try {
              if(obj.tagName) {
                return false;
              }
            }catch(exx) {}
              return true;
            }
        }
      }catch(ex) {
        if(typeof(obj) == 'object') {
          try {
            if(obj.tagName) {
              return false;
            }
          }catch(exx) {}
            return true;
          }
        }
        return false;
    },
  
    /**
     * Entfernt alle Elemente des uebergebenen Arrays.
     * 
     * @param {Object} obj
     */
    clearArray: function(obj) {
      if(jQuery.isArrayM(obj)) {
        while(obj.length > 0) {
          obj.shift();
        }
      } 
    },
  
    /**
     * Datevalidator fuer das Format tt.mm.jjjj.
     * 
     * @param {Object} dat
     */
    isDate: function(dat) {
      var erg = dat.match(/[0-9]{1,2}.[0-9]{1,2}.[0-9]{4}/gi);
      if (erg) {
        return true;
      }
      return false;
    },
  
    /**
     * Ermittelt die Differenz zweier Datumsangaben.
     * 
     * @param {Object} start-Datum
     * @param {Object} end-Datum
     */
    diffDate: function(start, end) {
      var difference = 0;  
      
      if (jQuery.isDate(start) == false) {
        return difference;
      }
      if (jQuery.isDate(end) == false) {
        return difference;
      } 
    
      difference = start-end;   
      return Math.round(difference/(1000*60*60*24));
    },
  
    /**
     * Numericvalidator.
     * 
     * @param {Object} val
     */
    isNumeric: function(val) {
      if (val == null || val == "" || !val.toString().match(/^[-]?\d*$/)) {
        return jQuery.isDecimal(val);
      }
        return true;
    },
  
    /**
     * Decimalvalidator.
     * 
     * @param {Object} val
     */
    isDecimal: function(val) {
      if(val == null || val == "" || !jQuery.trim(val.toString()).match(/(\d*?[-.,].*\d).*/)) return false;
      return true;
    },
  
    /**
     * Prueft ob eine uebergebene Map 'obj' den Key 'key' enthaelt.
     * 
     * @param {Object} key
     * @param {Object} obj
     */
    objContainsKey: function(key, obj) {
      if(jQuery.isObject(obj)) {
        var val = obj[key];
        if(val != undefined) {
          return true;
        }
      }
      return false;
    },
  
    /**
     * Liefert einen Numericwert aus einem uebergeben String.
     * 
     * @param {Object} val
     */
    getNumericValue: function(val) {
      if(jQuery.isNumeric(val)) {
        val = val.replace(/\./g, "");
        val = val.replace(/\,/g, ".");
        return parseFloat(val);
      }
      return 0;
    }
});

