(function() {
  jQuery.fn.dropdownNavigation = function(config){
    function navigate(){
      var loc = jQuery(this).val();
      if("" != loc){ document.location = loc };
      return false;
    };

    return jQuery(this).change(navigate);
  }
})(jQuery);



(function() {
  jQuery.fn.labeledTextField = function(config){
    var target = jQuery(this);
    var focusClass = config["focusClass"] || "focus";
    var message = config["message"];

    target.parents("form").get(0).reset();
    if(target.val() != message){ target.addClass(focusClass); };

    target.focus(function(){
        target.addClass(focusClass);
        if(target.val() == message){ target.val("") };
      });
    target.blur(function(){
        if(target.val() == ""){
          target.removeClass(focusClass).val(message);
        };
      });
    target.parents("form").submit(function(){
        if(target.val() == message){ target.val("") };
        return true;
      });
    return target;
  };
})(jQuery);



jQuery.fn.flashMessage = function(flashes, relativeUrlRoot){
  var flash = jQuery(this);
  if(jQuery.browser.ie){
    var position = flash.position();

    var iframe = jQuery("<iframe id='ie-select-fix'></iframe>").
      attr("src", relativeUrlRoot + "/blank").
      css("z-index",  flash.css("z-index")).
      css("width",  flash.width()).
      css("height",  flash.height()).
      css("top", position.top).
      css("left", position.left);

    flash.css("z-index", Number(iframe.css("z-index")) + 1).after(iframe);
  };

  flash.find(" > div").click(function(){
    jQuery("#ie-select-fix").hide();
    jQuery(this).fadeOut();
  });

  function showFlash(type, message, hideAfterSec){
    jQuery("#ie-select-fix").show();
    flash.find("div." + type).show().find("h3").text(message);
    if(hideAfterSec){
      setTimeout(function(){ flash.find("div." + type).trigger("click"); }, hideAfterSec * 1000);
    };
  };

  flash.bind("error",  function(_,message){ showFlash("error", message) }).
        bind("warn",   function(_,message){ showFlash("warn", message, 5) }).
        bind("notice", function(_,message){ showFlash("notice", message, 2) });

  jQuery.each(flashes, function(key,val){ flash.triggerHandler(key, val) });

  return flash;
};




(function() {
  jQuery.fn.iframeUploader = function(config){
    var submitCallback;
    function attachUploader(){
      var form = jQuery(this.contentWindow.document).find("form");
      if( config['trigger'] == 'submit' ){
        attachSubmitUploader(form);
      }else{
        attachAutoUploaderToInput(form);
      }
    };
    function attachSubmitUploader(f){
      f.submit(function(){
        var indicator = f.find("td.indicator img").show();
        f.get(0).submit();
        indicator.hide();
        var file = f.find("input[type=file]");
        file.focus();
        submitCallback = function(){
          f.get(0).reset();
        };
        return false;
      });
    };
    function attachAutoUploaderToInput(f){
      var timer = null;
      f.find('input').change(function(){
        if(timer){ clearTimeout(timer); };
        var file = f.find("input[type=file]");
        if(file.val().length > 0){
          var indicator = f.find("td.indicator img").show();
          submit = function(){ f.submit(); f.get(0).reset(); indicator.hide(); file.focus(); timer = null; };
          timer = setTimeout(submit, 5*1000);
        }else{
          return;
        }
      });
    }
    var afterLoadCallback = function(){
      if(submitCallback){submitCallback.call();}
      callback.call(this, targetIFrame);
    };

    var root = jQuery(this);
    var callback = config["callback"];

    jQuery("<div>").addClass("form").append(
      jQuery("<iframe>").attr("src", config["src"]["form"]).load(attachUploader)
    ).appendTo(root);

    var targetIFrame = jQuery("<iframe>").attr("src", config["src"]["target"]).attr("name", config["target"]).
      one("load", function(){ jQuery(this).load(afterLoadCallback); });

    jQuery("<div>").addClass("target").append(targetIFrame).appendTo(root);

    // IE6対策
    targetIFrame.get(0).contentWindow.name = config["target"];
  };
})(jQuery);
