//Pluginfile for IMX.jQuery Plugins
//Author: Axel Güldner (gueldner@infomax-it.de)
//Version 1.0
//Date 05.08.2008

jQuery.fn.extend({

//accordion
  accordion: function(value,direction,speed,callback){
		if(direction == "v"){
			newHeight = value + "px";
			return this.animate({height: newHeight}, speed, callback);
		}else{
			newWidth = value + "px";
			return this.animate({width: newWidth}, speed, callback);
		}
	}
});

jQuery.fn.extend({

//horizontal slide
  hslide: function(pixel,speed,callback){
		if(this.css("left") == "auto" || this.css("left") == "" || this.css("left") == "undefined"){
			this.css("left","0px");
		}
		if(this.width() - parseInt(pixel) + 10 <= -1 * (parseInt(this.css("left"))- parseInt(pixel))){
			return this.animate({left: "0px"}, speed, callback);
		}else{
			pixel = parseInt(this.css("left")) - pixel + "px";
			return this.animate({left: pixel}, speed, callback);
		}
	}
});

jQuery.fn.extend({
  glow: function(iterations){
        if(iterations && iterations > 0){
            iterations--;
            return this.fadeTo("slow", .15, function(){
                $(this).fadeTo("slow", 1, function(){$(this).glow(iterations);});
            });
        }
	}

});

jQuery.fn.extend({
  bounce: function(iterations, amount){
        if(!amount || amount == 0) amount = 10;
        newAmount = amount + "px";
        this.css({"position":"relative"});
        if(iterations && iterations > 0){
            iterations--;
            this.animate({
              "top": "-="+newAmount
            },"slow", "swing", function(){
                $(this).animate({
                    "top": "+="+newAmount
                },"slow", "swing", function(){$(this).bounce(iterations, amount);});
            });
        }
	}

});


//jQuery Function to compare two given dates and to increase the second if it is equal to or below the first
jQuery.fn.extend({
  compareDates: function(secondDate){
        //Erstellen eines Strings des neuen Anreisedatums mit umgekehrter Reihenfolge
        var newArrival = $(this).val().split("."); newArrival.reverse(); newArrival = newArrival.join("");
        //Erstellen eines Strings des aktuellen Abreisedatums mit umgekehrter Reihenfolge
        var currentDepart = $(secondDate).val().split("."); currentDepart.reverse(); currentDepart = currentDepart.join("");
        //Neues Abreisedatum erstellen, ist neues Anreisedatum plus fünf Tage
        var newDepart = parseInt(newArrival) + 1;
        //Umwandeln des neuen Abreisedatums in einen String
        newDepart += " ";
        //Prüfen ob aktuelles Abreisedatum kleiner oder gleich dem neuen Anreisedatums ist
        if(currentDepart <= newArrival){
            //Erstellen eines Strings des neuen Abreisedatums in normaler Reihenfolge
            currentDepart = newDepart.substr(6, 2) + "." + newDepart.substr(4, 2) + "." + newDepart.substr(0, 4);
            //Kalender mit neuem Abreisedatum und neuem kleinstmöglichen Abreisedatum aktualisieren
            //Aktuelles Abreisedatum ist dabei das neue Anreisedatum plus ein Tag
            $(secondDate).dpSetSelected(currentDepart).dpSetStartDate(currentDepart);
        }else{
            //Erstellen eines Strings des neuen Abreisedatums in normaler Reihenfolge
            currentDepart = newDepart.substr(6, 2) + "." + newDepart.substr(4, 2) + "." + newDepart.substr(0, 4);
            //Kalender mit neuem kleinstmöglichen Abreisedatum aktualisieren
            $(secondDate).dpSetStartDate(currentDepart);
        }
	}
});

jQuery.fn.extend({
  hideValueset: function(){
        //Timeout Funktion um Auswahlfelder wieder auszublenden
        $(document).unbind('mousedown', $.fn.hideValueset);
        $(".valuesetBox").fadeOut();
        $(".valuesetIcon").css({"backgroundPosition":"0 0"});
  },

  buildOutput: function(values, id){
    //Werteliste zu Array zerlegen
    values = values.split(",");
    //Jeden Wert einzeln als Listenelement aufnehmen
    output = "";
    for(key in values){
        output += "<li><a>"+values[key]+"</a></li>";
    }
    $("#valuesetBox"+id).empty();
    $("#valuesetBox"+id).append(output);

    //Klickfunktion für Listenelemente
    $("#valuesetBox"+id).children("li").click(function(){
        $(".valuesetIcon").css({"backgroundPosition":"0 0"});
        //Eventlistener für Klicks auserhalb löschen
        $(document).unbind('mousedown', $.fn.hideValueset);
        //Der zugehörigen Inputbox den Wert des aktuellen Listenelements zuweisen
        $("#"+id).attr("value",$(this).text());
        //Auswahlbox ausblenden
        $(this).parent().fadeOut();
    });

  },

  refreshContent: function(values, id, src, me){
    if(src){
      $.ajax({
        type: "POST",
        data: "request="+me.val(),
        async: false,
        url: src,
        success: function(data){values = data;}
      });
    };
    $.fn.buildOutput(values, id);
    //Einblenden der Auswahlbox
    $("#valuesetBox"+id).fadeIn();
    //Eventlistener für Klicks auserhalb erstellen
    $(document).bind('mousedown', $.fn.hideValueset);
    //Absolute Position ermitteln
    var offset = me.position();
    var left = offset.left + parseInt(me.css("marginLeft"));
    var top = offset.top + parseInt(me.css("marginTop"));
    //Auswahlbox neu positionieren
    $("#valuesetBox"+id).css({top: offset.top+"px", left: left+"px"});
  },


  getValues: function(me){
    var myValues = "";
    $.each(me.children("option"),function(){
        if(myValues != "") myValues+=",";
        myValues += $(this).text();
    });
    return myValues;
  },


  valueset: function(src){
    //Alle zutreffenden Objekte durchgehen
    this.each(function(){

        //Initialwert behalten
        var initialValue = $(this).children("option:first-child").text();

        //Werteliste aus option-tags auslesen
        var values = $.fn.getValues($(this));

        var output = "";
        //merken auf welches Objekt valueset angewendet wird
        var id = $(this).attr("id");

        //Dropdown durch Inputfeld ersetzen
        $(this).replaceWith("<input title=\""+$(this).attr("title")+"\" value=\""+initialValue+"\" autocomplete=\"off\" id=\""+$(this).attr("id")+"\" type=\"text\" class=\""+$(this).attr("class")+"\" name=\""+$(this).attr("name")+"\" /><span class=\"valuesetIcon\" id=\"valuesetIcon"+id+"\"></span>");

        //Objekt auf readonly setzen damit User die Werte nicht überschreiben kann
        if(!$.browser.msie && !src) $("#"+id).attr("readonly", "readonly");

        //Rahmen um Auswahlbox legen
        output = "<ul class=\"valuesetBox\" id=\"valuesetBox"+id+"\" style=\"display:none; position:absolute;\"></ul>";

        //Auswahlbox in DOM einfügen
        1+1;    //Aus irgendeinem Grund schläft der 6er IE hier ein. Die Rechenoperation stellt sicher das der IE aufwacht ohne das der User etwas merkt
        $("#"+id).parent().append(output);

        //Klickfunktion Inputfeld
        $("#"+id).keyup(function(){
            $("#valuesetIcon"+id).css({"backgroundPosition":"0 -16px"});
            if(src && $("#"+id).val() != "" && $("#"+id).val() != initialValue) $.fn.refreshContent(values, id, src, $("#"+id));
            else $.fn.refreshContent(values, id, undefined, $("#"+id));
        });
        $("#"+id).click(function(){
            $("#valuesetIcon"+id).css({"backgroundPosition":"0 -16px"});
            if(src && $("#"+id).val() != "" && $("#"+id).val() != initialValue) $.fn.refreshContent(values, id, src, $("#"+id));
            else $.fn.refreshContent(values, id, undefined, $("#"+id));
        });
        $("#"+id).select(function(){
            $("#valuesetIcon"+id).css({"backgroundPosition":"0 -16px"});
            if(src && $("#"+id).val() != "" && $("#"+id).val() != initialValue) $.fn.refreshContent(values, id, src, $("#"+id));
            else $.fn.refreshContent(values, id, undefined, $("#"+id));
        });
        $("#valuesetIcon"+id).click(function(){
            $("#valuesetIcon"+id).css({"backgroundPosition":"0 -16px"});
            if(src && $("#"+id).val() != "" && $("#"+id).val() != initialValue) $.fn.refreshContent(values, id, src, $("#"+id));
            else $.fn.refreshContent(values, id, undefined, $("#"+id));
        });
    });
  }
});
