/*
  Create Seitenbau-Namespace
*/
if (typeof top.SEITENBAU === 'undefined' || !top.SEITENBAU) {
  top.SEITENBAU = {};
}
if (typeof SEITENBAU === 'undefined' || !SEITENBAU) {
  var SEITENBAU = top.SEITENBAU;
}
/**
 * Create jQuery-UI Datepicker
 */
if (typeof SEITENBAU.fnc === 'undefined' || !SEITENBAU.fnc) {
  SEITENBAU.fnc = {};
}

/**
  * wurde die SEITENBAU.js bereits geladen
  */
if( typeof SEITENBAU.loaded === 'undefined' || SEITENBAU.loaded !== true  )
{
  /**
   * SEITENBAU.js als geladen setzen
   */
  SEITENBAU.loaded = true;


  /**
   * Registry-Tool
   *
   * Internal Registry-Tool
   */
  SEITENBAU.registry = function() {
    var sbReg = {};
    var defaultReg = 'defaultRegistry';

    var searchKey = function(regValue, regObj, caseInsensitive) {
      if(typeof regObj === 'undefiend' || !sbReg) {
        return false;
      }

      if(true === caseInsensitive) {
        regValue = regValue.toLowerCase();
      }

      for(var param in regObj) {
        var regCurValue = regObj[param];
        if(true === caseInsensitive) {
          regCurValue =  regCurValue.toLowerCase();
        }

        if(regValue === regCurValue) {
          return param;
        }
      }

      return false;
    }

    return {


      /**
       * set(regKey, regValue, regObj)
       *
       * @param regKey:String
       * @param regValue:[ANY]
       * @prarm regObj:String
       *
       * @return Boolean:TRUE
       */
      'set': function(regKey, regValue, regObj) {
        if(typeof regObj === 'undefiend' || !regObj) {
          regObj = defaultReg;
        }
        if(typeof sbReg[regObj] === 'undefiend' || !sbReg[regObj]) {
          sbReg[regObj] = [];
        }
        sbReg[regObj][regKey] = regValue;

        return true;
      },


      /**
       * get(regKey, regObj)
       *
       * @param regKey:String
       * @prarm regObj:String
       *
       * @return regValue:[ANY] || undefiend
       */
      'get': function(regKey, regObj) {
        if(typeof regObj === 'undefiend' || !regObj) {
          regObj = defaultReg;
        }
        if(typeof sbReg[regObj][regKey] === 'undefiend') {
          return undefiend;
        }
        else {
          return sbReg[regObj][regKey];
        }
      },

      /**
       * search(regValue, regObj, caseInsensitive)
       *
       * @param regValue:[ANY]
       * @param regObj:String
       * @param caseInsensitive:Boolean
       *
       * @return Array || false
       */
      'search': function(regValue, regObj, caseInsensitive) {
        if(typeof regObj === 'string' && regObj) {
          return searchKey(regValue, sbReg[regObj], caseInsensitive);
        }
        else {
          var returnArray = [];
          for(var param in sbReg) {
            var searchResult = searchKey(regValue, sbReg[param], caseInsensitive);
            if(false !== searchResult) {
              returnArray.push(searchResult);
            }
          }
          if(returnArray.length > 0) {
            return returnArray;
          }
          else {
            return false;
          }
        }
      },


      /**
       * drop(regKey, regObj, dropTree)
       *
       * @param regKey:String
       * @prarm regObj:String
       * @param dropTree:Boolean
       *
       * @return Boolean
       */
      'drop': function(regKey, regObj, dropTree) {
        if(typeof regObj === 'undefiend' || !regObj) {
          regObj = defaultReg;
        }
        if(typeof dropType !== 'undefiend' && true === dropTree) {
          delete sbReg[regObj];
          return true;
        }
        else {
          if(typeof sbReg[regObj][regKey] !== 'undefiend') {
            delete sbReg[regObj][regKey];
            return true;
          }
          return false;
        }
      }

    };
  } ();


  /**
   *
   * Internal funktionen duer den Datenaustausch
   *
   */
  SEITENBAU.DataExchange = function ( )
  {
    return {

      /**
       * Austausch-Daten speichern
       *
       * DataExchange.set( sExchangeId, hExchangeData );
       *
       * @param sExchangeId:Austausch-ID
       * @param hExchangeData:Austausch-Daten
       *
       * @return mixed
       */
      'set': function( sExchangeId, hExchangeData )
      {
        // Austauschdaten merken
        top.SEITENBAU.registry.drop( sExchangeId, 'DATAEXCHANGE', true );
        top.SEITENBAU.registry.set( sExchangeId, hExchangeData, 'DATAEXCHANGE' );

        return true;
      },

      /**
       * Austausch-Daten abfragen
       *
       * getDataExchange( sExchangeId );
       *
       * @param sExchangeId:Austausch-ID
       *
       * @return mixed:Austausch-Daten
       */
      'get': function( sExchangeId )
      {
        // Austauschdaten ermitteln
        return top.SEITENBAU.registry.get( sExchangeId, 'DATAEXCHANGE' );
      }

    };
  } ();


  /**
   * load external Script
   *
   * getSript(src, callback, refresh);
   *
   * @param src:String
   * @param callback:Function
   * @param refresh:Boolean
   *
   * @return Void
   */
  SEITENBAU.getScript = function() {
    var regObjName = 'getScriptCache';
    var regKey;

    return function(src, callback, refresh) {
      if(typeof jQuery === 'undefiend' || !jQuery) {
        return false;
      }

      regKey = SEITENBAU.registry.search(src, regObjName, false)

      if(true === refresh || false === regKey) {
        if(false === regKey) {
          var hashDate = new Date();
          regKey = hashDate.getTime();
        }

        jQuery.getScript(src, function() {
          SEITENBAU.registry.set(regKey, src, regObjName);
          if(typeof callback === 'function') {
            callback();
          }
        });
      }
      else {
        if(typeof callback === 'function') {
          callback();
        }
      }
    };
  } ();

  /**
  * Datepicker fuer das Artikeldatum
  */
  SEITENBAU.fnc.artikeldatumPicker = function(){
    return function(opts) {

        var sDatumBisher = $(opts.sDatumsFeld).val();
        if(!sDatumBisher && opts.iSetToday){
          $(opts.sDatumsFeld).val(opts.iSetToday);
          updateLinked(opts.iSetToday);
        }
        $.datepicker.setDefaults($.datepicker.regional[opts.sLang]);
         $(opts.sDatumsFeld).datepicker(
                                         {
                                            minDate: new Date(2003, 1 - 1, 1)
                                            ,maxDate: new Date(2015, 12 - 1, 31)
                                            ,beforeShow: readLinked
                                            ,onSelect: updateLinked
                                            ,showOn: 'both'
                                            ,dateFormat: 'yymmdd'
                                            ,buttonImageOnly: true
                                            ,buttonImage: '/cms_tools/images/datePicker/cal.gif'
                                            //~ ,buttonText: 'CAL'
                                        }
         );
        // Prepare to show a date picker linked to three select controls
        function readLinked() {
            $(opts.sDatumsFeld).val(
                $(opts.sJahrSelect).val() +
                $(opts.sMonatSelect).val() +
                $(opts.sTagSelect).val()
            );
        }

        // Update three select controls to match a date picker selection
        function updateLinked(date) {
            $(opts.sTagSelect).val(date.substring(6,8));
            $(opts.sMonatSelect).val(date.substring(4, 6));
            $(opts.sJahrSelect).val(date.substring(0, 4));
        }

        $([opts.sTagSelect,opts.sMonatSelect,opts.sJahrSelect]).each( function(){$(this).change(checkLinkedDays);});
        // Prevent selection of invalid dates through the select controls
        function checkLinkedDays() {
            var daysInMonth = 32 - new Date($(opts.sJahrSelect).val(),
            $(opts.sMonatSelect).val() - 1, 32).getDate();
            $('option',opts.sTagSelect).attr('disabled', '');
            $('option:gt(' + (daysInMonth - 1) +')',opts.sTagSelect).attr('disabled', 'disabled');
            if ($(opts.sTagSelect).val() > daysInMonth) {
                $(opts.sTagSelect).val(daysInMonth);
            }
            readLinked();
        }
    }
  }();
  /**
  * Datepicker fuer das Reminderdatum
  */
  SEITENBAU.fnc.reminderDatumPicker = function(){
    return function(opts) {
        var sDatumBisher = $(opts.sDatumsFeld).val();
        if(!sDatumBisher && opts.iSetToday){
          $(opts.sDatumsFeld).val(opts.iSetToday);
          updateLinked(opts.iSetToday);
        }
        $.datepicker.setDefaults($.datepicker.regional[opts.sLang]);
         $(opts.sDatumsFeld).datepicker(
                                         {
                                            minDate: new Date(2008, 1 - 1, 1)
                                            ,maxDate: new Date(2015, 12 - 1, 31)
                                            ,beforeShow: readLinked
                                            ,onSelect: updateLinked
                                            ,showOn: 'both'
                                            ,dateFormat: 'yy-mm-dd'
                                            ,buttonImageOnly: true
                                            ,buttonImage: '/cms_tools/images/datePicker/cal.gif'
                                            //~ ,buttonText: 'CAL'
                                        }
         );
        // Prepare to show a date picker linked to three select controls
        function readLinked() {
            $(opts.sDatumsFeld).val(
                $(opts.sJahrSelect).val() +'-'+
                $(opts.sMonatSelect).val() +'-'+
                $(opts.sTagSelect).val()
            );
        }

        // Update three select controls to match a date picker selection
        function updateLinked(date) {
            $(opts.sTagSelect).val(date.substring(8,10));
            $(opts.sMonatSelect).val(date.substring(5, 7));
            $(opts.sJahrSelect).val(date.substring(0, 4));
        }

        $([opts.sTagSelect,opts.sMonatSelect,opts.sJahrSelect]).each( function(){$(this).change(checkLinkedDays);});
        // Prevent selection of invalid dates through the select controls
        function checkLinkedDays() {
            var daysInMonth = 32 - new Date($(opts.sJahrSelect).val(),
            $(opts.sMonatSelect).val() - 1, 32).getDate();
            $('option',opts.sTagSelect).attr('disabled', '');
            $('option:gt(' + (daysInMonth - 1) +')',opts.sTagSelect).attr('disabled', 'disabled');
            if ($(opts.sTagSelect).val() > daysInMonth) {
                $(opts.sTagSelect).val(daysInMonth);
            }
            readLinked();
        }
    }
  }();


  /**
  * Datepicker fuer das Reminderdatum
  */
  SEITENBAU.fnc.expiryDatumPicker = function(){
    return function(opts) {
        var sDatumBisher = $(opts.sDatumsFeld).val();
        if(!sDatumBisher && opts.iSetToday){
          $(opts.sDatumsFeld).val(opts.iSetToday);
          updateLinked(opts.iSetToday);
        }
        $.datepicker.setDefaults($.datepicker.regional[opts.sLang]);
         $(opts.sDatumsFeld).datepicker(
                                         {
                                            minDate: new Date(2008, 1 - 1, 1)
                                            ,maxDate: new Date(2015, 12 - 1, 31)
                                            ,beforeShow: readLinked
                                            ,onSelect: updateLinked
                                            ,showOn: 'both'
                                            ,dateFormat: 'yy-mm-dd'
                                            ,buttonImageOnly: true
                                            ,buttonImage: '/cms_tools/images/datePicker/cal.gif'
                                            //~ ,buttonText: 'CAL'
                                        }
         );
        // Prepare to show a date picker linked to three select controls
        function readLinked() {
            $(opts.sDatumsFeld).val(
                $(opts.sJahrSelect).val() +'-'+
                $(opts.sMonatSelect).val() +'-'+
                $(opts.sTagSelect).val() +' '+
                $(opts.sStundeSelect).val() +':'+
                $(opts.sMinuteSelect).val()
            );
        }

        // Update three select controls to match a date picker selection
        function updateLinked(date) {
            $(opts.sTagSelect).val(date.substring(8,10));
            $(opts.sMonatSelect).val(date.substring(5, 7));
            $(opts.sJahrSelect).val(date.substring(0, 4));
            readLinked();
        }

        $([opts.sTagSelect,opts.sMonatSelect,opts.sJahrSelect,opts.sStundeSelect,opts.sMinuteSelect]).each( function(){$(this).change(checkLinkedDays);});
        // Prevent selection of invalid dates through the select controls
        function checkLinkedDays() {
            var daysInMonth = 32 - new Date($(opts.sJahrSelect).val(),
            $(opts.sMonatSelect).val() - 1, 32).getDate();
            $('option',opts.sTagSelect).attr('disabled', '');
            $('option:gt(' + (daysInMonth - 1) +')',opts.sTagSelect).attr('disabled', 'disabled');
            if ($(opts.sTagSelect).val() > daysInMonth) {
                $(opts.sTagSelect).val(daysInMonth);
            }
            readLinked();
        }
    }
  }();

} // ENDE Klammerung: SEITENBAU.js bereits geladen
