/**
 * Einige tolle Funktionen, die von Allgemeiner Nützlichkeit sind.
 */

var Util = {

    /**
     * Macht es möglich, mit IDs <b>oder</b> DOM-Objekten zu arbeiten:
     * Interpretiert Parameter als String mit ID oder als DOM-
     * Objekt und gibt immer ein DOM-Objekt zurück.
     *
     * @param     test    String oder DOM-Objekt
     * @return            DOM-Objekt
     * @type              Object
     */

    idDom: function(test) {
        if(test.tagName)
            return test
        else {
            //console.log("yo", test, Util.idDom.caller);
            return document.getElementById(test);
        }
    },

    /**
     * co -- convert to object
     *
     * Wandelt ein Array in ein Objekt um, mit den Array-Werten
     * als Schlüssel. So kann man leicht testen, ob ein Element in
     * einem Array enthalten ist.
     *
     * @param   array   Array
     * @return          Object
     * @type            Object
     *
     */
    co: function(array) {
        var obj = {};
        for( var i=0; i<array.length; i++) {
            obj[array[i]]='';
        }
        return obj;
    },

    /**
     * ca -- convert to array
     *
     * Wandelt ein Objekt in einen Array um, mit den Objekt-Schlüsseln
     * als Array-Elementen. So kann man die Anzahl der Elemente eines
     * Objektes leicht herausfinden.
     *
     * @param   object  Object
     * @return          Array
     * @type            Array
     */

    ca: function(object) {
        var array = [];
        for(var i in object) {
            array.push(i);
        }
        return array;
    },

    /**
     * removeFromArray -- ein element irgendwo in einem array löschen
     *
     * @param  array Array
     * @param        Element
     */

    removeFromArray: function(element, arr) {
      var position = $.inArray(element, arr);
      arr.splice(position, 1);
    }
};



/**
 * equalHeights: alle Kind-Elemente eines Eltern-Elements
 * auf die gleiche Höhe setzen ... praktisch für Spalten.
 * Meine erste echte jQuery-Erweiterung!! :D
 *
 * Anmerkung rs: die Abfrage mit der subform auskommentiert, funktioniert nicht richtig
 *
 */


$.fn.equalHeights = function(tag) {
  if (tag == null) tag = 'div'; //default tag
  jQuery(this).each(function(){
    var tallest = 0;
    
    $(this).children(tag).each(function(i){
      var height = $(this).height();
      //console.log('height='+height);
      //      if ( $(this).find('.subForm').height()>0) height -= $(this).find('.subForm').height();
      if ( height > tallest) { tallest = height; }
    });

    // IE6 kann keine min-height
    if ($.browser.msie && $.browser.version == 6.0) {
      $(this).children(tag).css({'height': tallest});
      var tops = this.currentStyle.paddingTop.match(/\d+/);
      var bottoms = this.currentStyle.paddingBottom.match(/\d+/);
      tallest += parseInt(tops[0])+parseInt(bottoms[0]);
      //alert(tallest);
      $(this).css({'height': tallest});
    } else {
      jQuery(this).children(tag).css({'min-height': tallest});
    }

  });
  return this;
};

/**
 * productscroller: ermoeglicht das scrollen einer produktliste
 * Papameter: Scrollweite, Produktanzahl, Linker Scrollbutten, Rechter  Scrollbutten, Produkt Blocktyp (default 'li')
 * 
 */

(function ($) {
    $.fn.productscroller = function (scroll_width, button_left, button_right, product_type ) {
     
      if (product_type== null ) product_type = 'li'; //default

      var scrollproducts = this;
      
      $.each(scrollproducts, function (){
        var scrollproduct = $(this);
        var max_width = 0;
        scrollproduct.find(product_type).each(function(){
          max_width += $(this).outerWidth();
        });
        scrollproduct.width(max_width);
        $(button_left).css({'visibility':'hidden'});
        if (max_width<scroll_width) $(button_right).css({'visibility':'hidden'});

        $(button_right).click(function(){
         var scroll;
         $(button_left).css({'visibility':'hidden'});
         $(button_right).css({'visibility':'hidden'});
         var p = -parseInt(scrollproduct.css('marginLeft'));
         if (max_width-p-scroll_width>scroll_width) {
            scroll = scroll_width;
         }
         else{ 
            scroll=max_width-p-scroll_width;
         }
         scrollproduct.animate({marginLeft: '-='+scroll},1000, function(){
           $(button_left).css({'visibility':'visible'});
           var margin = parseInt(scrollproduct.css('marginLeft'));
           if (scroll_width-margin<max_width) $(button_right).css({'visibility':'visible'});
         }); 
       });
   
  
   
       $(button_left).click(function(){
         var scroll;
         $(button_right).css({'visibility':'hidden'});
         $(button_left).css({'visibility':'hidden'});
         var p = parseInt(scrollproduct.css('marginLeft'));
          if (p+scroll_width<0) {
            scroll = scroll_width;
         }
         else{ 
            scroll=-p;
         }
         scrollproduct.animate({marginLeft: '+='+scroll},1000, function(){
           $(button_right).css({'visibility':'visible'});
           var margin = -parseInt(scrollproduct.css('marginLeft'));
           if (margin>0) $(button_left).css({'visibility':'visible'});
           });
       });
     }); 
  
    };
}(jQuery));

/**
 * jquery.dump.js
 * @author Torkild Dyvik Olsen
 * @version 1.0
 * 
 * A simple debug function to gather information about an object.
 * Returns a nested tree with information.
 * 
 */
(function($) {

$.fn.dump = function() {
   return $.dump(this);
}

$.dump = function(object) {
   var recursion = function(obj, level) {
      if(!level) level = 0;
      var dump = '', p = '';
      for(i = 0; i < level; i++) p += "\t";
      
      t = type(obj);
      switch(t) {
         case "string":
            return '"' + obj + '"';
            break;
         case "number":
            return obj.toString();
            break;
         case "boolean":
            return obj ? 'true' : 'false';
         case "date":
            return "Date: " + obj.toLocaleString();
         case "array":
            dump += 'Array ( \n';
            $.each(obj, function(k,v) {
               dump += p +'\t' + k + ' => ' + recursion(v, level + 1) + '\n';
            });
            dump += p + ')';
            break;
         case "object":
            dump += 'Object { \n';
            $.each(obj, function(k,v) {
               dump += p + '\t' + k + ': ' + recursion(v, level + 1) + '\n';
            });
            dump += p + '}';
            break;
         case "jquery":
            dump += 'jQuery Object { \n';
            $.each(obj, function(k,v) {
               dump += p + '\t' + k + ' = ' + recursion(v, level + 1) + '\n';
            });
            dump += p + '}';
            break;
         case "regexp":
            return "RegExp: " + obj.toString();
         case "error":
            return obj.toString();
         case "document":
         case "domelement":
            dump += 'DOMElement [ \n'
                  + p + '\tnodeName: ' + obj.nodeName + '\n'
                  + p + '\tnodeValue: ' + obj.nodeValue + '\n'
                  + p + '\tinnerHTML: [ \n';
            $.each(obj.childNodes, function(k,v) {
               if(k < 1) var r = 0;
               if(type(v) == "string") {
                  if(v.textContent.match(/[^\s]/)) {
                     dump += p + '\t\t' + (k - (r||0)) + ' = String: ' + trim(v.textContent) + '\n';
                  } else {
                     r--;
                  }
               } else {
                  dump += p + '\t\t' + (k - (r||0)) + ' = ' + recursion(v, level + 2) + '\n';
               }
            });
            dump += p + '\t]\n'
                  + p + ']';
            break;
         case "function":
            var match = obj.toString().match(/^(.*)\(([^\)]*)\)/im);
            match[1] = trim(match[1].replace(new RegExp("[\\s]+", "g"), " "));
            match[2] = trim(match[2].replace(new RegExp("[\\s]+", "g"), " "));
            return match[1] + "(" + match[2] + ")";
         case "window":
         default:
            dump += 'N/A: ' + t;
            break;
      }
      
      return dump;
   }
   
   var type = function(obj) {
      var type = typeof(obj);
      
      if(type != "object") {
         return type;
      }
      
      switch(obj) {
         case null:
            return 'null';
         case window:
            return 'window';
         case document:
            return 'document';
         case window.event:
            return 'event';
         default:
            break;
      }
      
      if(obj.jquery) {
         return 'jquery';
      }
      
      switch(obj.constructor) {
         case Array:
            return 'array';
         case Boolean:
            return 'boolean';
         case Date:
            return 'date';
         case Object:
            return 'object';
         case RegExp:
            return 'regexp';
         case ReferenceError:
         case Error:
            return 'error';
         case null:
         default:
            break;
      }
      
      switch(obj.nodeType) {
         case 1:
            return 'domelement';
         case 3:
            return 'string';
         case null:
         default:
            break;
      }
      
      return 'Unknown';
   }
   
   return recursion(object);
}

function trim(str) {
   return ltrim(rtrim(str));
}

function ltrim(str) {
   return str.replace(new RegExp("^[\\s]+", "g"), "");
}

function rtrim(str) {
   return str.replace(new RegExp("[\\s]+$", "g"), "");
}

})(jQuery);



