var jwindow = jQuery(window);

var UIAction = {
  slideshow: function(elements, start, options){
    
    var settings = {
      interval: 1000,
      limit: 9
    }
    jQuery.extend(settings, options);
   	
    var log = { htmlOverflow: jQuery('html').css('overflow') }
    jQuery('html').css('overflow', 'hidden');
    
    window.scroll(0,0);
    jQuery('body').attr("onContextmenu","return false;");
    
    var jwindow = jQuery(window);
    var center = { x: (jwindow.width()+jwindow.scrollLeft())/2, y: (jwindow.height()+jwindow.scrollTop()-100)/2 };
    
    var bg2        = jQuery('<div id="bg2"></div>').appendTo('body');
    var background = jQuery('<div id="background"></div>').appendTo('body');
    var photoinfo  = jQuery('<div id="photoinfo"></div>').appendTo(background);
    var control    = jQuery('<div id="control"></div>').appendTo(background);
    var control2   = jQuery('<div id="control2"></div>').appendTo(background);
    var control3   = jQuery('<div id="control3"></div>').appendTo(background);
    var imagesarea = jQuery('<div id="imagesarea"></div>').appendTo(background 
                                                                   );
    var prev       = jQuery('<img id="prev" src="images/buttonSlsPrev.gif" alt="前の画像" />').appendTo(control);
    var play       = jQuery('<img id="play" src="images/buttonSlsStart.gif" alt="スライドショーの開始" />').appendTo(control)
    var next       = jQuery('<img id="next" src="images/buttonSlsNext.gif" alt="次の画像" />').appendTo(control);
    
    var cond = {
      position    : start,
      playing     : false,
      speed       : 5,
      timerid     : null,
      displaymode : 1
    }

    var theme = {
      back: "white"
    }

    var iastat = {
      start  : 0,
      len    : 0,
      imglen : 83,
      imgl   : '<img src="images/bgSlsLeft.gif" />',
      imgr   : '<img src="images/bgSlsRight.gif" />'
    }

    function  makeClosure(cpos) {
      var closure = function(){
        jQuery('#gauge' + cpos).attr('src', 'images/buttonSlsNeedle.gif');
        jQuery('#gauge' + cond.speed)
        .attr('src', 'images/buttonSlsBorder.gif');
        cond.speed = cpos;
      }
      return closure;
    }
    
    function setposition() {
　　　　　if(jwindow.height() > 768){
      		cond.displaymode = 1;
      		bgHeight = 835;
      }else{
      		cond.displaymode = 2;
      		bgHeight = 735;
      }
    	
      bg2.css( { position: "absolute", left: 0, top: 0,
                 width: jwindow.width(), height: jwindow.height(),
                 background: "black", zIndex: 1000 }).opacity(8);
      background.css( { position: "absolute", left: 0,
                        top: Math.max(((jwindow.height() - bgHeight) / 2), 0),
                        width: jwindow.width(), height: bgHeight,
                        background: theme.back, zIndex: 1010 });
      
      if(cond.displaymode == 1) {
        center = { x: (jwindow.width()+jwindow.scrollLeft())/2,
                   y: (jwindow.height()+jwindow.scrollTop()-100)/2 };
      
        imagesarea.css( { position: "absolute", left: 0,
                          top: jwindow.height() - 115,
                          width: jwindow.width(), height: 83, zIndex: 1100 } );
        photoinfo.css( { position: "absolute", left: 74, top: 22,
                         width: 400, zIndex: 1100 } );
        control.css( { position: "absolute",
                       left: (jwindow.width() - 140 -40), top: jwindow.height() - 160,
                       width: 150, height: 22, zIndex: 1100 } );
        control2.css( { position: "absolute",
                        left: (jwindow.width() - 140 - 37),
                        top: jwindow.height() - (160 - 24), width: 140, height: 22, zIndex: 1100 }
                    );
      } else {
        center = { x: (jwindow.width() - 75 - 20 )/2 + 75 + 20,
                   y: (jwindow.height())/2 };
      
        imagesarea.css( { position: "absolute", left: 20,
                          top    : 0,
                          width  : 75,
                          height : jwindow.height(),
                          zIndex : 1100 } );
        photoinfo.css( { position: "absolute", left: 20+75+20,
                         top: 22, width: 200, zIndex: 1100 } );
        control.css( { position: "absolute",
                       left: (jwindow.width() - 140 - 40),
                       top: jwindow.height() - 60,
                       width: 150, height: 22, zIndex: 1100 } );
        control2.css( { position: "absolute",
                        left: (jwindow.width() - 140 - 38),
                        top: jwindow.height() - 30,
                        width: 150, height: 22, zIndex: 1100 }
                    );
      }
      control3.css( { position: "absolute",
                      left: (jwindow.width() - 150 + 90),
                      top: 22, width: 23, height: 23, zIndex: 1200 } );
                      
      //_open(cond.position);
    }

    function reloadImagesarea(start, len) {
      iastat.start = start;
      if(cond.displaymode == 1) {
        iastat.len   = Math.floor((jwindow.width() - 140) / iastat.imglen);
        iastat.imgl  = '<img src="images/bgSlsLeft.gif" />';
        iastat.imgr  = '<img src="images/bgSlsRight.gif" />';
      } else {
        iastat.len   = Math.floor((jwindow.height() - 120) / iastat.imglen);
        iastat.imgl  = '<img src="images/bgSlsTop.gif" />';
        iastat.imgr  = '<img src="images/bgSlsBottom.gif" />';
      }

      if(start != 0) {
        jQuery(iastat.imgl)
        .click(function(){reloadImagesarea(Math.max(start - iastat.len, 0)); })
        .appendTo(imagesarea.empty());
        jQuery('img[@index="'+cond.position+'"]').css('background', '#f0f080');
      } else {
        jQuery(iastat.imgl).
        appendTo(imagesarea.empty());
      }
        
      for(i=start ;
          i < start + Math.min(iastat.len, (elements.length - start)) ;
          i++) {
        elem = elements[i];
        
        jQuery('<img src="'+elem.small+'" width="75" height="75" index="' +
               i + '" style="padding: 4px; background: #a3a3a3;" />')
        .appendTo(imagesarea)
        .click(function(){
          index = jQuery(this).attr('index');
          play.click(_play_start);
          prev.opacity(10);
          play.opacity(10);
          next.opacity(10);
          if(index == 0) {
            prev.opacity(5);
          }
          if((parseInt(index) + 1) == elements.length) {
            play.unbind('click');
            play.opacity(5);
            next.opacity(5);
          }
          _open(index);
        });
      }
      if(start+iastat.len < elements.length) {
        jQuery(iastat.imgr)
        .click(function() {
          reloadImagesarea(start+iastat.len) } )
        .appendTo(imagesarea);
        jQuery('img[@index="'+cond.position+'"]').css('background', '#f0f080');
      } else {
        jQuery(iastat.imgr)
        .appendTo(imagesarea);
      }
    }

    _init();
    _open(start);

    function _init(){
      setposition();
      prev.css( { width: 43, margin: 2 } );
      play.css( { width: 43, margin: 2 } );
      next.css( { width: 43, margin: 2 } );
      if(start == 0) {
        prev.opacity(5);
      }
      if((start + 1) == elements.length) {
        play.unbind('click');
        play.opacity(5);
        next.opacity(5);
      }

      reloadImagesarea(start);

      prev.click(function(){
        _openPrev();
      });
      
      next.click(function(){
        _openNext();
      });
      
      play.click(_play_start);
      
      gauge = jQuery('<div id="gauge"></div>').appendTo(control2);

      jQuery('<img id="gauge" src="images/buttonSlsGaugeS.gif" />')
      .appendTo(gauge);
      for(gpos=1; gpos<11; gpos++) {
        if( gpos == cond.speed ) {
          jQuery('<img id="gauge' + gpos +
                 '" src="images/buttonSlsNeedle.gif" />')
          .appendTo(gauge);
        } else {
          var closure = makeClosure(gpos);
          jQuery('<img id="gauge' + gpos +
                 '" src="images/buttonSlsBorder.gif" />')
          .clickable(closure)
          .appendTo(gauge);
        }
      }
      jQuery('<img id="gauge" src="images/buttonSlsGaugeE.gif" />')
      .appendTo(gauge);
        
      jQuery('<span id="quit"><img src="images/buttonSlsClose.gif" alt="閉じる" /></span>')
      .appendTo(control3)
      .clickable(function(){
        _quit();
      });
      
      jwindow.resize(function(){
        setposition();
        reloadImagesarea(cond.position);

        jQuery('#screen').css( { left: center.x-jQuery('#screen').width()/2, top: center.y-jQuery('#screen').height()/2 } );
      });
    }

    function _play_start(){
      if( cond.playing ){
        cond.playing = false;
        clearTimeout(cond.timerid);
        jQuery('#play', control).attr('src', 'images/buttonSlsStart.gif');
      } else {
        cond.playing = true;
        cond.timerid = setTimeout(function(){ _play(); }, (11 - cond.speed) * settings.interval);
        jQuery('#play', control).attr('src', "images/buttonSlsStop.gif");
      }
    }

    function _play(){
      if( cond.position + 1 < elements.length ){
        play.click(_play_start);
        prev.opacity(10);
        play.opacity(10);
        next.opacity(10);
        _openNext();
        cond.timerid = setTimeout(function(){ _play(); }, (11 - cond.speed) * settings.interval);
      }else{
        jQuery('#play', control).attr('src', 'images/buttonSlsStart.gif');
        play.unbind('click');
        play.opacity(5);
        next.opacity(5);
        cond.playing = false;
        clearTimeout(cond.timerid);
      }
    }
    
    function _open(index){
      if( index >= 0 && index < elements.length ){
        elem = elements[index];
        image = new Image();
        image.src = elem.full;
        
        if( image.complete ){
        	_openImage(image);
        }else{
	        jQuery(image).load(function(){
	          	_openImage(image);
	        });
	    }
        
        photoinfo.empty()
        .append('<h1>'+elem.title+'</h1>')
        .append('<p>'+elem.desc+'</p>');
        
        jQuery('img', photoinfo)
        .css( { float: 'left', margin: '0px 5px 0px 0px' } );
        
        jQuery('img',imagesarea).css('background', '#a3a3a3');
        jQuery('img[@index="'+index+'"]').css('background', '#f0f080');
        
        cond.position = parseInt(index);
      }
    }
    
    /* 画像サイズをwindowサイズに合うように変換して返す */
    function adjustImageSize(width, height){    	
    	attrWidth = width;
        attrHeight = height;
        
        wHeight = jwindow.height();
        wWidth = jwindow.width();
        
        /* 上下の余白 */
        adjustHeight = 225;
        adjustWidth = 100;
        
        if(height > width){
		    maxHeight = wHeight - adjustHeight;
    		if(attrHeight > maxHeight){
    			attrHeight = maxHeight;
    		}
    		attrWidth = width * (attrHeight/height);
    		
	    	maxWidth = wWidth - adjustWidth;
    		if(attrWidth > maxWidth){
    			attrWidth = maxWidth;
    			attrHeight = height * (attrWidth/width);
    		}
        }else{
	    	maxWidth = wWidth - adjustWidth;
    		if(attrWidth > maxWidth){
    			attrWidth = maxWidth;
    		}
			attrHeight = height * (attrWidth/width);
    		
    		maxHeight = wHeight - adjustHeight;
    		if(attrHeight > maxHeight){
    			attrHeight = maxHeight;
    			attrWidth = width * (attrHeight/height);
	    	}
        }
        
        return {width: attrWidth, height: attrHeight};
    }
        
    function _openImage(image){
    	jQuery("#screen").attr("id", "old-screen")
    		.fadeOut("slow", function(){ jQuery("#old-screen").remove(); });
        
        _displayImage(image);
	}
	
	/* 画像を表示する */
	function _displayImage(image){
		size = adjustImageSize(image.width, image.height);
        
        jQuery(image).attr("id", "screen")
        	.appendTo('body')
          	.css({ position: "absolute", zIndex: 1050, width: size.width,
                   height: size.height, top: center.y - size.height/2,
                   left: center.x - size.width/2, display: "none" })
          	.wrap('<a href="'+elem.link+'"></a>')
          	.fadeIn("normal");
	}
    
    function _openPrev(){
      to = cond.position-1;
      if(to == 0) {
        prev.opacity(5);
      } else {
        if( to < iastat.start ) {
          reloadImagesarea(Math.max(to-iastat.len+1, 0));
        }
      }
      play.click(_play_start);
      play.opacity(10);
      next.opacity(10);
      _open(to);
    }
    
    function _openNext(){
      to = cond.position+1;
      if(to + 1 == elements.length) {
        jQuery('#play', control).attr('src', 'images/buttonSlsStart.gif');
        play.unbind('click');
        play.opacity(5);
        next.opacity(5);
      }
      if( (iastat.start + iastat.len) < to +1 ) {
        reloadImagesarea(to);
      }
      prev.opacity(10);
      _open(to);
    }
    
    function _quit(){
      bg2.remove();
      background.remove();
      imagesarea.remove();
      photoinfo.remove();
      prev.remove();
      play.remove();
      next.remove();
      control.remove();
      control2.remove();
      control3.remove();
      jQuery('#old-screen').remove();
      jQuery('#screen').remove();
      jQuery('body').removeAttr("onContextmenu");
      
      clearTimeout(cond.timerid);
      
      jQuery('html').css( { overflow: log.htmlOverflow } );
    }
  },
  selector: function(callback, templates, options){
  	
	var settings = {
		width: 100,
		height: 100,
		columns: 5
	}
	jQuery.extend(settings, options);
	
	if( jQuery("#crepe-ui-selector").size() != 0 ){
		return jQuery("#crepe-ui-selector");
	}else{
		var jwindow = jQuery(window);
		var foreground = jQuery("<div id='crepe-ui-selector'>")
		.css({ background: "white", position: "absolute", border: "2px ridge gray" })
		.appendTo("body");
		
		for(i=0; i<templates.length; i++){
			template = templates[i];
			
			elem = jQuery("<button key='"+template.key+"'>")
			.append("<img src='"+template.src+"' />")
			.append("<p style='color: black'>"+template.name+"</p>")
			.css({ background: "white", width: settings.width, height: settings.height, float: "left", margin: "2px", textAlign: "center", border: "1px solid gray"});
			
			if( template.tooltip ){ elem.attr("title", template.tooltip); }
			
			elem.click(function(evt){
				callback(jQuery(evt.target).unbind().attr("key"));
				foreground.fadeOut("fast", function(){ foreground.remove() });
			}).appendTo(foreground);
			
			if( i%settings.columns == settings.columns-1 ){
				jQuery("<br style='clear: left' />").appendTo(foreground);
			}
		}
		
		jQuery("<input type='button' value='キャンセル' />")
		.css({ display: "block", margin: "auto 2px 2px auto" })
		.click(function(){
			foreground.fadeOut(300, function(){ foreground.remove() });
		})
		.appendTo(foreground);
		
		foreground.css({ width: (settings.width+4)*settings.columns });
		foreground.css({ left: (jwindow.width()-foreground.width())/2+jwindow.scrollLeft(), top: (jwindow.height()-foreground.height())/2+jwindow.scrollTop(), border: "2px ridge gray" })
	  
	  	return foreground;
	}
  }
}

jQuery.fn.floatside = function(options){
	var settings = {
		prefix: "",
		mouseoverable: false,
		direction: "east",
		zIndex: 10000
	}
	jQuery.extend(settings, options);
	
	jQuery.each(jQuery(this), function(i,obj){
		jQuery("#"+settings.prefix+jQuery(obj).attr("id")).css("display", "none");
	});
	
	jQuery(this).mouseover(function(evt){
		var self = jQuery(evt.target);
		floatid = "#"+settings.prefix+self.attr("id");
		
		var left, top;
		if( settings.direction.match(/West/i) ){
			left = self.offset().left - jQuery(floatid).outerWidth();
		}else if( settings.direction.match(/East/i) ){
			left = self.offset().left + self.outerWidth();
		}else{
			left = self.offset().left;
		}
		
		if( settings.direction.match(/North/i) ){
			top = self.offset().top - jQuery(floatid).outerHeight();
		}else if( settings.direction.match(/South/i) ){
			top = self.offset().top + self.outerHeight();
		}else{
			top = self.offset().top;
		}
		
		var float = jQuery(floatid).css( { display: "block", position: "absolute", left: left, top: top, zIndex: settings.zIndex } );
		self.mouseout(function(evt){
			if( !settings.mouseoverable || !float.inside(evt.pageX, evt.pageY) ){
				float.css("display", "none");
				self.unbind("mouseout");
			}
		});
		if( settings.mouseoverable ){
			float.mouseout(function(evt){
				if( !float.inside(evt.pageX, evt.pageY) ){
					float.css("display", "none");
					float.unbind("mouseout");
				}
			});
		}
	});
}

jQuery.fn.popupmessage = function(options){
	
	var settings = {
		message: "表示するメッセージを指定してください",
		width: 320,
		height: 240,
		direction: "northwest"
	}
	jQuery.extend(settings, options);
	
	target = jQuery(this);
	
	jQuery(this).clickable(function(evt){
		target.unbind();
		
		var fromLeft, fromTop;
		if( settings.direction.match(/West/i) ){ fromLeft = evt.pageX - settings.width; }
		else if( settings.direction.match(/East/i) ){ fromLeft = evt.pageX; }
		else{ fromLeft = evt.pageX - settings.width/2; }
		
		if( settings.direction.match(/North/i) ){ fromTop = evt.pageY - settings.height; }
		else if( settings.direction.match(/South/i) ){ fromTop = evt.pageY; }
		else{ fromTop = evt.pageY - settings.height/2; }
		
		popup = jQuery("<div class='popupmessage'></div>").css({
			position: "absolute",
			backgroundColor: "white",
			border: "1px solid black",
			width: settings.width,
			height: settings.height,
			left: fromLeft,
			top: fromTop
		})
		.html(settings.message)
		.click(function(){
			popup.remove();
			target.popupmessage(settings);
		})
		.appendTo("body");
	});
}

jQuery.fn.popupedit = function(callback, options){
	
	var settings = {
		highlight: "transparent",
		highlightBorder: null,
		type: "textarea",
		elems: null,
		width: 350,
		height: 130,
		background: "white",
		decideLabel: "決定",
		cancelLabel: "キャンセル",
		title: "",
		data: null,
		minLength: 1,
		maxLength: 2000,
		emptyMessage: null,
		submessage: null
	}
	jQuery.extend(settings, options);
	callback = callback == null ? function(){} : callback;
	
	var jwindow = jQuery(window);
	var target = jQuery(this);
	
	var popup = null;
	var input = null;
	var decide = null;
	var cancel = null;
	
	_init();
	
	function _init(){
		if( settings.emptyMessage != null && jQuery.trim(target.text()) == "" ){
			target.html('<span class="emptyMessage">'+settings.emptyMessage+'</span>');
		}
		
		target.clickable(function(evt){
			target.unbind();
			
			popup = jQuery('<div class="popup">')
			.css( { display: "none" } )
			.appendTo('body');
			
			if( settings.title ){
				popup.html('<h2 class="popupTitle">'+settings.title+'</h2>');
			}
			
			if( settings.type == "textfield" ){
				input = jQuery('<input type="textfield">').css( { width: settings.width-6, clear: "both" } ).appendTo(popup);
				
				if( typeof(settings.data) == 'function' ){
					input.val( settings.data( jQuery(evt.target || evt.srcElement) ) );
				}else{
					input.val( settings.data );
				}
			}else if( settings.type == "textarea" ){
				input = jQuery('<textarea>');
				if( settings.title == "" ){
					input.css( { width: settings.width-4, height: settings.height-30, clear: "both" } ).appendTo(popup);
				}else{
					input.css( { width: settings.width-4, height: settings.height-50, clear: "both" } ).appendTo(popup);
				}
				
				if( typeof(settings.data) == 'function' ){
					input.val( settings.data( jQuery(evt.target || evt.srcElement) ) );
				}else{
					input.text( settings.data );
				}
			}else if( settings.type == "select" ){
				input = jQuery('<select>').css( { float: "left" } ).appendTo(popup);
				
				value = '';
				if( typeof(settings.data) == 'function' ){
					value = settings.data( jQuery(evt.target || evt.srcElement) );
				}else{
					value = settings.data;
				}
				
				if( settings.elems ){
					for(i=0; i<settings.elems.length; i++){
						e = settings.elems[i];
						if( value == e.value ){
							input.append('<option value="'+e.value+'">'+e.text);
						}else{
							input.append('<option value="'+e.value+'">'+e.text);
						}
					}
					jQuery('option[@value="'+value+'"]').attr("selected", "selected");
				}
				input.after("<br style='clear: left'>");
			}
			
			if( settings.submessage != null ){
				jQuery('<span class="submessage">'+settings.submessage+'</span>').appendTo(popup);
			}
			
			inputdiv = jQuery('<div>').appendTo(popup);
			
			decide = jQuery('<input type="button">')
			.attr("value", settings.decideLabel)
			.click(function(){
				if( settings.type == "select" ){
					value = input.val();
					callback(value, evt);
					_quit();
				}else{
					text = jQuery.trim( input.val() );
					
					if( text.length < settings.minLength ){
						alert(settings.minLength+"文字以上の入力が必要です");
					}else if( text.length > settings.maxLength ){
						alert(settings.maxLength+"文字まで入力可能です");
					}else{
						callback(input.val(), evt);
						_quit();
					}
				}
			}).appendTo(inputdiv);
			
			cancel = jQuery('<input type="button">')
			.attr("value", settings.cancelLabel)
			.click(function(){
				_quit();
			}).appendTo(inputdiv);
			
			
			fromLeft = evt.pageX > jwindow.width()/2 ? evt.pageX - settings.width : evt.pageX;
			fromTop = evt.pageY - popup.height();
			
			popup.css( { position: "absolute", left: fromLeft, top: fromTop, background: settings.background, padding: "5px", border: "1px solid black", textAlign: "right", display: "" } )
			input[0].focus();
		},
		{ highlight: settings.highlight, highlightBorder: settings.highlightBorder });
	}
	
	function _quit(){
		popup.remove();
		target.popupedit(callback, options);
	}
}

jQuery.fn.popupwindow = function(options){
	var settings = {
		popup: "popup",
		left: 0,
		top: 0,
		width: 300,
		height: 200
	}
	jQuery.extend(settings, options);
	
	var jthis  = jQuery(this);
	var jpopup = jQuery("<div class='popupwindow'>").css({ position:"absolute", left:settings.left, top:settings.top, width:settings.width, height:settings.height }).appendTo("body");
	
	jQuery.each(jthis, function(i,obj){
		var jobj   = jQuery(obj);
		var jtarget = jQuery("#"+settings.popup+jobj.attr("id"));
		
		jtarget.visible(false);
		jobj.click(function(){
			jpopup.empty().append( jtarget.clone().visible(true) );
		});
	});
}

var _dataset = {};
jQuery.fn.visible = function(visible, opt1, opt2){
	if( visible ){
		if( opt1 == "center" ){
			jQuery(this).css({
				left: (jwindow.width()-jQuery(this).width())/2+jwindow.scrollLeft(),
				top: (jwindow.height()-jQuery(this).height())/2+jwindow.scrollTop()
			});
		}else if( opt1 && opt2 ){
			jQuery(this).css({ left: opt1, top: opt2});
		}
		
		jQuery(this).css({ display: _dataset[jQuery(this).attr("id")] });
	}else{
		_dataset[jQuery(this).attr("id")] = jQuery(this).css("display");
		jQuery(this).css({ display: "none" });
	}
	
	return this;
}

jQuery.fn.floating = function(options){

	var settings = {
		handle: null,
		xpos: 0,
		ypos: 0,
		zIndex: 1000
	}
	jQuery.extend(settings, options);
	var callback = callback || function(){};
	
	var target = jQuery(this).css({ position: "absolute", zIndex: settings.zIndex, left: settings.xpos, top: settings.ypos });

	jQuery(settings.handle).mousedown(function(e){
		dx = e.pageX - jQuery(this).fromLeft();
		dy = e.pageY - jQuery(this).fromTop();
		
		jQuery(document).mousemove(function(e){
			target.css( { left: e.pageX-dx, top: e.pageY-dy } );
		});
		
		jQuery(document).mouseup(function(){
			jQuery(document).unbind();
		});
	});
	
	return this;
}

jQuery.fn.clickable = function(callback, options){
	
	var settings = {
		highlight: 'transparent',
		highlightBorder: null,
		confirm: null
	}
	var callback = callback || function(){};
	
	if( options ){
		jQuery.extend(settings, options);
	}
	
	this.click( function(evt){
		resetHighlight(evt.target);
		jQuery(evt.target).css( { backgroundColor: 'transparent' } );
		if( settings.confirm == null || confirm(settings.confirm) ){
			callback(evt);
		}
	}).highlight( { color: settings.highlight, borderColor: settings.highlightBorder } );
	
	return this;
}

jQuery.fn.highlight = function(options){
	var settings = {
		color: 'transparent',
		borderColor: null
	}
	jQuery.extend(settings, options);
	
	var elem = jQuery(this);
	var orig = new Array();
	_init();
	
	return this;
	
	function _init(){
		elem.mouseover(function(evt){
			_set(evt.target);
			
			jQuery(evt.target).css( "background-color", settings.color );
			
			if( settings.borderColor != null ){
				jQuery(evt.target).css( "border", '1px inset '+settings.borderColor );
			}
		});
		
		elem.mouseout( function(evt){
			_reset(evt.target);
		});
		
		elem.click( function(evt){
			_reset(evt.target);
		});
	}
	
	function _search(sel){
		for(i=0; i<orig.length; i++){
			if( orig[i].sel == sel ){
				return orig[i];
			}
		}
	}
	
	function _set(sel){
		if( ! _search(sel) ){
			orig.push( { sel: sel, color: jQuery(sel).css("background-color"), border: jQuery(sel).css("border") } );
		}
	}
	
	function _reset(sel){
		dat = _search(sel);
		
		jQuery(sel).css({
			backgroundColor: dat.color ? dat.color : "transparent",
			border: dat.border ? dat.border : "none"
		});
	}
}

function resetHighlight(selector){
	jQuery(selector).css({ 
		backgroundColor: 'transparent',
		border: 'none'
	});
}

jQuery.fn.editable = function(options){
	
	var settings = {
		decide: function(){},
		cancel: function(){},
		decideLabel: '決定',
		cancelLabel: 'キャンセル',
		buttonPosition: 'right',
		type: "textfield",
		fontSize: 'same',
		highlight: 'white',
		width: '300px',
		height: '150px',
		emptyText: '未入力',
		confirm: null,
		visible: false,
		convert: function(val){ return val; },
		validate: function(val){ return null; },
		options: new Array(),
		addedElement: jQuery('<span>')
	}
	jQuery.extend(settings, options);
	
	var log = { html: jQuery(this).html(), text: jQuery(this).text() };
	var parent = jQuery(this);
	
	var input = null;
	var decide = null;
	var cancel = null;
	
	_init();
	if( settings.visible ){
		_open();
	}
	
	return this;
	
	function _init(){
		log.html = parent.html();
		parent.clickable(function(){ _open(); },{ highlight: settings.highlight } );
		settings.fontSize = ( settings.fontSize == "same" ) ? parent.css("font-size") : settings.fontSize;
		
		if( settings.type == "textarea" ){
			input = jQuery('<textarea>').css( { width: settings.width, height: settings.height, fontSize: settings.fontSize } );
		}else if( settings.type == "textfield" || settings.type == "fieldadder" ){
			input = jQuery('<input type="text">').css( { width: settings.width, fontSize: settings.fontSize } );
		}else if( settings.type == "select" ){
			input = jQuery('<select>').css( { width: settings.width } );
			
			for(i=0; i<settings.options.length; i++){
				opt = settings.options[i];
				jQuery('<option>').attr("value", opt.value)
								  .text(opt.text)
								  .appendTo(input);
			}
		}
		
		decide = jQuery('<input type="button">').attr("value", settings.decideLabel);
		cancel = jQuery('<input type="button">').attr("value", settings.cancelLabel);
	}
	
	function _open(){
		text = jQuery.browser.msie ? parent.html().replace(/<BR>/g, '\n') : parent.html().replace(/<br>/g, '\n');
		text = jQuery.trim(text);
		
		parent.css( { background: "transparent" } ).empty().unbind();
		if( settings.type == "textfield" || settings.type == "textarea" || settings.type == "fieldadder" ){
			input.attr("value", text).text(text).appendTo(parent);
		}else if( settings.type == "select" ){
			input.appendTo(parent);
			jQuery('option[@text="'+log.text+'"]', input).attr("selected", "selected");
		}
		
		if( settings.buttonPosition == "bottom" ){
			parent.append('<br>');
		}
		
		decide.click(function(){
			if( settings.confirm == null || confirm(settings.confirm) ){
				if( settings.type == "textfield" || settings.type == "textarea" || settings.type == "fieldadder" ){
					text = settings.convert( jQuery.trim( input.val() ) );
					text = ( text == '' ) ? settings.emptyText : text;
					
					validateMessage = settings.validate( text );
					if( validateMessage == null || validateMessage == '' ){
						settings.decide(text, parent);
						htmlText = text.replace(/\n/g, '<br/>');
						
						if( settings.type == "textfield" || settings.type == "textarea" ){
							parent.html(log.html).text('').append(htmlText);
							
							jQuery.extend(settings, { visible: false } );
							parent.editable(settings);
						}else if( settings.type == "fieldadder" ){
							settings.addedElement.clone()
												 .text(text)
												 .insertBefore(parent);
						}
					}else{
						alert(validateMessage);
					}
				}else if( settings.type == "select" ){
					sel = jQuery(":selected", input);
					settings.decide(sel.attr("value"), parent);
					
					parent.html(log.html)
						  .text('')
						  .append(sel.text());
					
					jQuery.extend(settings, { visible: false } );
					parent.editable(settings);
				}
			}
		})
		.appendTo(parent);
		
		cancel.click(function(){
			settings.cancel(parent);
			parent.empty().html(log.html);
			jQuery.extend(settings, { visible: false } );
			parent.editable(settings);
		})
		.appendTo(parent);
	}
}

jQuery.fn.blockEnter = function(){
	jQuery(this).keypress(function(e){
		var charCode = (e.charCode) ? e.charCode : ((e.which) ? e.which : e.keyCode );
		if( Number(charCode) == 13 || Number(charCode) == 3 ){
			e.preventDefault(); e.stopPropagation();
		}
	});
}

jQuery.fn.innerLabel = function(){
	
	jQuery.each(this, function(i,obj){
		var label = jQuery(obj);
		var input = jQuery("#"+label.attr("for"));
		
		var box = jQuery("<div class='innerLabels'></div>").insertBefore(label);
		box.append(label);
		box.append(input);
		
		box.css( { position: "relative", width: input.outerWidth(), height: input.outerHeight(), float: "left" } );
		
		input.css( { position: "absolute", left: 0, top: 0, zIndex: 100 } );
		label.css( { display: ( input.val() ? "none" : "block" ), position: "absolute", left: (input.outerHeight()-label.outerHeight())/2, top: (input.outerHeight()-label.outerHeight())/2, zIndex: 200 } );
		input.focus(function(evt){
			jQuery("label[@for='"+jQuery(evt.target).attr("id")+"']").css("display", "none");
		});
		input.blur(function(evt){
			if( !jQuery(evt.target).val() ){
				jQuery("label[@for='"+jQuery(evt.target).attr("id")+"']").css("display", "block");
			}
		});
	});
}

jQuery.fn.slidearea = function(options){

	var settings = {
		element: ".element",
		slider: ".slider",
		bar: ".slidebar"
	}
	jQuery.extend(settings, options);
	
	var self    = jQuery(this);
	var slider  = jQuery(settings.slider, self).css({ position: "relative" });
	var bar     = jQuery(settings.bar, slider).css({ position: "absolute" });
	
	init();
	
	function init(){
		w = 0, n = 0;
		jQuery.each(jQuery(settings.element, self), function(i,obj){
			newW = w+jQuery(obj).width();
			jQuery(obj).css( { display: ( newW > self.width() ? "none" : "block" ) } );
			
			if( newW < self.width() ){
				n++; w=newW;
			}
		});
		
		bar.css( { left: 0, width: (slider.innerWidth()-(bar.outerWidth()-bar.innerWidth()))*n/jQuery(settings.element, self).size() } );
		
		bar.mousedown(function(evt){
			var px = evt.pageX - ( bar.offset().left - slider.offset().left );
			
			jQuery("body").mousemove(function(evt){
				moveTo( evt.pageX - px );
			});
			
			jQuery("body").mouseup(function(evt){ jQuery("body").unbind(); });
		});
		
		slider.click(function(evt){
			moveTo( evt.pageX - bar.outerWidth()/2 - slider.offset().left );
		});
	}
	
	function moveTo(x){
		bar.css( { left: ( x < 0 ? 0 : ( x+bar.outerWidth() >= slider.innerWidth() ? slider.innerWidth()-bar.outerWidth() : x ) ) } );
	
		li = ( bar.offset().left - slider.offset({border: true}).left ) * jQuery(settings.element, self).size() / slider.innerWidth();
		jQuery.each(jQuery(settings.element, self), function(i,obj){
			jQuery(obj).css( { display: ( i >= li && i < li+n ? "block" : "none" ) } );
		});
	}
}

jQuery.fn.linkButton = function(){
	jQuery(this).click(function(evt){
		location.href = jQuery(evt.target).attr("value");
	});
}

jQuery.fn.fromTop = function(){
	var offset = 0;
	
	var div = this[0];
	while(div){
		offset += div.offsetTop;
		div = div.offsetParent;
	}
	
	return offset;
}
	
jQuery.fn.fromLeft = function(){
	var offset = 0;
	
	var div = this[0];
	while(div){
		offset += div.offsetLeft;
		div = div.offsetParent;
	}
	
	return offset;
}

jQuery.fn.inside = function(x, y){
	var jthis = jQuery(this);
	var offset = jthis.offset();
	
	var insideX = offset.left <= x && offset.left+jthis.width() >= x;
	var insideY = offset.top  <= y && offset.top+jthis.height() >= y;
	
	return insideX && insideY;
}

jQuery.fn.opacity = function(opacity){
	
	if( jQuery.browser.msie ){
		jQuery.each(jQuery(this), function(i,obj){
			obj.style.filter = 'alpha(opacity=' + (opacity * 10) + ')';
		});
	}else if( jQuery.browser.mozilla ){
		jQuery.each(jQuery(this), function(i,obj){
			obj.style.MozOpacity = opacity / 10;
		});
	}else{
		jQuery.each(jQuery(this), function(i,obj){
			obj.style.opacity = opacity / 10;
		});
	}
	
	return this;
}

var jutil = {
	toBr: function(text){
		return text.replace(/\n/g, '<br>');
	},
	fromBr: function(text){
		return jQuery.browser.msie ? parent.html().replace(/<BR>/g, '\n') : parent.html().replace(/<br>/g, '\n');
	}
}