
(function($){
		  
	var 

	//// Properties ////////////////////////////
	methods,
	elem, //this
	conf,
	def,
	
	//// DOM ////////////////////////////
	$body,
	$this,
	$select,
	$submit,
	$input,
	$selectDef,
	$selectDef,
	$submitDef,
	$inputDef,
	$optDef,
	$ssBtnRight,$ssBtn
	
	//Methods
	toString,
	
	//// Shortcuts ////////////////////////////
	void0 = 'javascript:void(0);',
	//href = 'href',
	//isIE = !$.support.opacity,
	//isIE6 = isIE && !window.XMLHttpRequest,
	isIE7 = (navigator.appVersion.indexOf('MSIE 7.')==-1) ? false : true,
	
	//Events
	//$('selector').bind(evt_**,function(){}); //イベント登録
	//$.event.trigger(evt_**); //イベント送出
	evt_selectComplete = "evt_selectComplete"
	
	;
	////DefaultParamatorz ////////////////////////////
	def = {
		search_string_encode:'', /*文字列をエスケープする場合は ecl.js を読み込んでください。*/
		css_prefix:'search_select', // static
		default_input_words:'S_E_A_R_C_H',
		input:'search_input',
		submit:'search_submit_button',
		select:'search_select',
		start_zIndex:100,
		slideSpd:234,
		pulldown_position:'under_select' //or 'over_select'
	};
	
	//// Constractor ////////////////////////////
	$.fn.swapSelectForm = function (options, custom_callback) {
		
		if (this.length) {
			this.each(function () {
				var data = $(this).data(toString()) ? $.extend({},
					$(this).data(toString()), options) : $.extend({}, def, options);
				$(this).data(toString(), data).addClass(toString()+"_element");
			});
		} else {
			$(this).data(toString(), $.extend({}, def, options));
		}
		
		elem = this
		$this = $(elem)
		conf = $(elem).data(toString())
		
		$body = $('body')
		
		//erase
		$selectDef = $this.find('#'+conf.select).length ? $this.find('#'+conf.select) : $this.find('select')
		$submitDef = $this.find('#'+conf.submit).length ? $this.find('#'+conf.submit) : $this.find('input[type=submit]')
		$inputDef = $this.find('#'+conf.input).length ? $this.find('#'+conf.input) : $this.find('input[type=text]')
		$selectDef.hide()
		$submitDef.hide()
		
		//autoGet default search Words.
		conf.default_input_words = ( def.default_input_words != conf.default_input_words ) ? 
		conf.default_input_words : $inputDef.attr('value');
		
		//create DOM
		$overlay = $div('overlay')
		var ssname = $selectDef.attr('class')
		$content = $div("content").addClass(ssname);
		$optDef = $selectDef.children('option')//.attr('value')
		$ssValues = $('<ul class="'+ssname+'_values"></ul>')
		$optDef.each(function(i,e){
			var $e = $(e)
			$ssValues.append('<li title="'+$e.attr('value')+'"><a href="javascript:void(0);">'+$e.text()+'</a></li>')
		})
		$ssBtnRight = $('<span class="'+ssname+'_button_right"></span>')
		$content.append(
			$ssBtn=$('<a href="javascript:void(0);" class="'+ssname+'_button">'+$optDef.filter('[selected]').text()+'</a>').append($ssBtnRight),
			/*$ssValues,*/
			$submit = $('<a href="javascript:void(0);" class="'+$submitDef.attr('class')+'">'+$submitDef.attr('value')+'</a>')
		)
		
		$this.append($content)
		$body.append($ssValues)
		$body.prepend($overlay)
		
		//setDefaultWidth(IE FIX) And Selection.
		var tmpw = 15
		$ssValues.find('a').each(function(i,e){
			tmpw = Math.max($(e).innerWidth(),tmpw)
		})
		$ssValues.find('a').css({'width':tmpw})
		$ssValues.find('li[title='+$optDef.filter('[selected]').attr('value')+'] a').addClass('selected')
		
		
		//serClassProperty
		$overlay.css({
			'z-index':conf.start_zIndex,
			'display':'none',
			'position':'absolute',
			'width':$body.outerWidth(),
			'height':$body.outerHeight()
		})
		$ssValues.css({
			'z-index':conf.start_zIndex+1,
			'display':'none',
			'position':'absolute',
			'left':$ssBtn.offset().left,
			'top':$ssBtn.offset().top + $ssBtn.innerHeight()
		})
		
		
		//addEventListener
		$ssBtn.click(openSelect)
		$overlay.click(closeSelect)
		$ssValues.find('a').click(closeSelect)
		
		
		//$submit.preventDefault('click')
		$inputDef.keydown(function(ev){if(ev.keyCode==13)return false;})
		$submit.click(postForm)
		
		return this;
	};
	
	// jQuery object generator to save a bit of space
	function $div(n) {
		return $('<div class="' +conf. css_prefix + '_' + n + '"/>');
	}
	
	//// makeElements ////////////////////////////
	init = function () {
	};
	
	function toString(){
		return 'swapSelectForm';
	};
	
	function openSelect(e) {
		$ssValues.css({
			'left':$ssBtn.offset().left,
			'top':$ssBtn.offset().top + $ssBtn.innerHeight()
		}).slideDown(conf.slideSpd)
		$overlay.css({
			'display':'block',
			'width':$body.outerWidth(),
			'height':$body.outerHeight()
		})
	};
	function closeSelect(e) {
		$tar = $(e.target)
		//alert($tar.attr('class') == $overlay.attr('class') ? 'is $overlay!':'is not $overlay..')
		switchSelectAttr($tar);
		
		$.event.trigger(evt_selectComplete)
		$ssValues.slideUp(conf.slideSpd)
		$overlay.hide()
	};
	
	function switchSelectAttr($tar,f) {
		if($tar.attr('class') != $overlay.attr('class')){
			$optDef.filter('[selected]').removeAttr('selected') 
			$optDef.filter('[value='+$tar.parent().attr('title')+']').attr('selected','selected')
			$ssBtn.html($optDef.filter('[selected]').text()).append($ssBtnRight)
			$ssValues.find('a').each(function(i,e2){
					if($(e2).hasClass('selected'))
						$(e2).removeClass('selected');
			})
			$tar.addClass('selected')
		}
	}
	
	
	function postForm(e) {
		
		//searchWords is empty?
		if($inputDef.attr('value') == conf.default_input_words || $inputDef.attr('value') == ''){
			//alert('karappo!')
			$inputDef.focus()
			return;
		}
		
		
		switch(conf.search_string_encode.toLowerCase()){
			case "euc-jp":
				var path = $this.attr('action')+'?'
				$this.find('input[type!=submit],select[name]').each(function(i,e){
					var $e = $(e)
					if($e.is('select')){
						path += $e.attr('name')+'='+$e.find('option[selected]').attr('value')
					}else if($e.attr('name') ==  $inputDef.attr('name')){
						path += $e.attr('name')+'='+EscapeEUCJP($e.attr('value'))
					}else{
						
						path += $e.attr('name')+'='+$e.attr('value')
					}
					path += '&'
				})
				
				path = path.substr(0,path.length-1)
				document.location.href = path;
			break;
			default:
				$this.submit();
			break;
		}
		
		/**/
		
		
		//alert(path)
		//$this.attr('method','get')
		/*
		switch($this.attr('method')){
			case 'post':
				$this.submit();
			break;
			case 'get':
				document.location.href = path;
			default:
			break;;
		}*/
		
		return false;
	}
	
	
	//// Create Public Methods ////////////////////////////
	methods = $.fn.swapSelectForm;
	methods.toString = toString;
	methods.openSelect = openSelect;
	methods.closeSelect = closeSelect;
	methods.switchSelectAttr = switchSelectAttr;
	methods.postForm = postForm;
	methods.conf = conf;
	
	//// Initialize when the DOM has loaded ////////////////////////////
	$(function () {
		init();
	});

}(jQuery));
