if ( typeof E1gp == 'undefined' ) E1gp = {};

new function(){
	E1gp.form = (function(){
		var S;
		var config;
		var car_type;
		var color_num;
		
		return {
			init : function(settings){
				var self = this;
				config   = settings;
				S    = config.selector;
				car_type = $(S.avatar_type+':checked').val();
				
				this.show_default_view();
				this.set_change_avatar_events();
				this.change_avatar_image();
				
				setTimeout(function(){
					self.set_change_area();
					self.set_change_maker();
					self.set_change_car_type();
					self.check_area_id();
					self.check_maker_id();
					self.check_car_id();
					self.set_change_disabled();
					self.change_disabled();
					self.set_ganre_select();
					
					$('#displacement_id').css('width', '250px');
					$('#sale_start').css('width', '200px');
					$('#mission_type').css('width', '200px');
				}, 0);
			},
			show_default_view : function(){
				var self = this;
				if ( $(S.city_id).val() != config.prefix.kanagawa_id ) $(S.local_node).hide();
				if ( $(S.maker_id).val() == "" ) $(S.car_node).hide();
				
				setTimeout(function(){
					self.set_default_color();
				}, 0);
			},
			set_default_color : function(){
				var color    = $(S.input_avatar_color).val();
				var add_node = $(S.avatar_color+':eq('+(color-1)+')').parent('li').addClass('checked');
				if ( add_node.length == 0 ) return;
				var img_src  = add_node.find('img').attr('src');
				if ( img_src.match(config.regex.is_hover_img) ) {
					add_node.find('img').attr('src', img_src);
					add_node.find('img').attr('hsrc', img_src);
				} else {
					var selected_src = img_src.replace(config.regex.is_unhover_img, '$1_on$2');
					add_node.find('img').attr('src', selected_src);
				}
			},
			set_change_avatar_events : function(){
				this.change_avatar_type();
				this.change_avatar_color();
			},
			// アバタータイプ切り替え時のイベントセット
			change_avatar_type : function(){
				var self = this;
				$(config.selector.avatar_type).click(function(){
					$(this).attr('checked', true);
					self.change_avatar_image();
				});
			},
			// 画像切り替え処理(選択時と非選択時)
			change_avatar_color : function(){
				var self = this;
				$(S.avatar_color).click(function(e){
					e.preventDefault();
					var src = $('img', this).attr('src');
					
					var ul = $(this).parents('ul');
					var li = $(this).parent('li');
					li.addClass('checked');
					color_num = $('li', ul).index(li.get(0)) + 1;
					$(S.input_avatar_color).val(color_num);
					
					var other_img = ul.find('li.checked').not(li)
										.removeClass('checked').find('img');
					if ( other_img.length != 0 ) {
						var o_src = other_img.attr('src');
						if ( o_src.match(config.regex.is_hover_img) ) {
							var tmp = o_src.split(config.prefix.hover_img);
							other_img.attr('src', tmp[0]+tmp[1]);
						}
					}
					
					$(this).parents('ul').find('img').unbind();
					$('img', this).unbind().mouseout(function(){
						$(this).attr('src', src);
					});
					
					self.change_avatar_image();
				});
			},
			// アバターのプレビュー画像切り替え
			change_avatar_image : function(){
				var type  = $(S.avatar_type+':checked').val() || 1;
				var color = $(S.input_avatar_color).val();
				if ( color == 0 ) color = 1;
				
				var P = config.prefix;
				$(S.avatar_image).attr('src', P.avatar_img+type+'_'+color+P.avatar_img_ext);
			},
			// 都道府県のセレクトボックスにイベントセット
			set_change_area : function(){
				var self = this;
				$(S.city_option).unbind('.area').bind('click.area', function(){
					var city_id = self.check_area_id();
					if ( !city_id || city_id <= 0 ) return;
					E1gp.api.get_local_area(city_id);
				});
			},
			// 神奈川県以外は市区町村を非表示に
			check_area_id : function(){
				var city_id = $(S.city_id).val();
				if ( city_id == config.prefix.kanagawa_id ) {
					$(S.local_node).show();
				} else {
					$(S.local_id).val('');
					$(S.local_node).hide();
				}
				return city_id;
			},
			// メーカーのセレクトボックスにイベントセット
			set_change_maker : function(){
				var self = this;
				$(S.maker_option).unbind('.maker').bind('click.maker', function(){
					var maker_id = self.check_maker_id();
					if ( !maker_id ) return;
					if ( maker_id != 0 ) $(S.maker_non_select).remove();
					E1gp.api.get_car_type(maker_id);
				});
			},
			// その他の場合はテキストボックスを表示
			check_maker_id : function(){
				var maker_id = $(S.maker_id).val();
				if ( maker_id == -1 ) {
					$(S.maker_name).removeClass('hidden');
					this.to_others_style();
					return false;
				}
				$(S.maker_name).addClass('hidden');
				return maker_id;
			},
			// 車種のセレクトボックスにイベントセット
			set_change_car_type : function(){
				var self = this;
				$(S.car_option).click(function(){
					self.check_car_id();
				});
			},
			// その他の場合はテキストボックスを表示
			check_car_id : function(){
				var car_id = $(S.car_id).val();
				if ( car_id == -1 ) {
					this.to_others_style();
					return $(S.car_name).removeClass('hidden');
				}
				$(S.car_name).addClass('hidden');
			},
			to_others_style : function(){
				$(S.car_node).jcClearAll();
				$(S.car_node).jcAdd( -1, 'その他', true );
				$(S.car_node).css({
					'width'  : 105+'px'
				});
				$(S.car_name).removeClass('hidden');
			},
			set_change_disabled : function(){
				var self = this;
				$(S.ganre_flag).unbind('.ganre').bind('click.ganre', function(){
					self.change_disabled();
				})
			},
			change_disabled : function(){
				setTimeout(function(){
					if ( $(S.ganre_flag+':checked').length == 1 ) {
						$(S.ganre)
							.removeAttr('disabled')
							.attr('enabled', true);
					} else {
						$(S.ganre)
							.removeAttr('checked')
							.removeAttr('enabled')
							.attr('disabled', true);
					}
				}, 0);
			},
			set_ganre_select : function(){
				var self = this;
				setTimeout(function(){
					$(S.ganre).unbind('.select_ganre').bind('click.select_ganre', function(){
						self.check_ganre_count(this);
					});
				}, 0);
			},
			check_ganre_count : function(node){
				setTimeout(function(){
					if ( $(S.ganre+':checked').length > 3 ) {
						$(node).removeAttr('checked');
						alert(config.message.ganre_over);
					}
				}, 0);
			},
			check_errors : function(){
				if ( $(S.pop_link+S.error_node).length == 0 ) return;
				$(S.pop_link+S.error_node+':first').click();
			}
		}
	})();
	
	E1gp.api = (function(){
		var config;
		var S;
		
		return {
			init : function(settings){
				config = settings;
				S = config.selector;
			},
			// 車種取得
			get_car_type : function(maker_id){
				$.ajax({
					url : config.api.car+'?date='+new Date().getTime(),
					data : {
						'maker_id' : maker_id,
						'type'     : 1
					},
					dataType: 'json',
					cache: true,
					success: function(d, s) {
						var res = d.response;
						if ( res.head.code != 200 ) return;
						if ( typeof res.body.model_list[1] == 'undefined' ) {
							$(S.car_id).val('');
							$(S.car_node).hide();
						} else {
							$(S.car_node).jcClearAll();
							var count      = 0;
							var max_length = 1;
							var current    = 1;
							var s_info = $(S.car_node).jcAddAll( res.body.model_list, current, 'model_id', 'model_name' );
							E1gp.commons.show_select_box(S.car_node, s_info.count, s_info.max_length);
							E1gp.form.set_change_car_type();
							E1gp.form.check_car_id();
						}
					}
				})
			},
			// 市区町村取得
			get_local_area : function(city_id){
				$.ajax({
					url : config.api.address+'?date='+new Date().getTime(),
					data : {
						'city_id' : city_id
					},
					dataType : 'json',
					cache: true,
					success : function(d, s){
						var res = d.response;
						if ( res.head.status != 200 ) return;
						$(S.local_node).jcClearAll();
						if ( res.body.area_list.length == 0 ) {
							$(S.local_id).val('');
							$(S.local_node).hide();
						} else if ( res.body.area_list.length == 1 && typeof res.body.area_list[0] != 'undefined' ) {
							$(S.local_id).val(res.body.area_list[0].local_id);
							$(S.local_node).hide();
						} else {
							var count       = 0;
							var max_length  = 1;
							var current     = 1;
							var s_info = $(S.local_node).jcAddAll( res.body.area_list, current, 'local_id', 'local_name' );
							E1gp.commons.show_select_box(S.local_node, s_info.count, s_info.max_length);
							E1gp.form.set_change_area();
						}
					}
				})
			},
			get_wishlist : function(){
				var self = this;
				var id = $(S.user_id).val();
				if ( !id || id == '' ) return;
				
				$.ajax({
					url : config.api.wishlist+'?date='+new Date().getTime(),
					data : {
						'id' : id
					},
					dataType : 'json',
					cache: true,
					success : function(d, s){
						if ( typeof d.status == 'undefined' ) return;
						$(S.wishlist+' .unit').remove();
						switch ( d.status ) {
							case 200:
								if ( typeof d.data == 'undefined' ) return;
								$.each( d.data, function(){
									$(S.wishlist+' h5').after(self.get_unit_html(this));
								});
								break;
							case 400:
								if ( typeof d.text == 'undefined' ) return;
								if ( $('body').attr('class') == 'otherlisence' ) {
									d.text = config.message.otherlisence;
									$(S.wishlist+' h5').after(self.get_message_html(d.text, 'faild'));
								} else {
									$(S.wishlist+' h5').after(self.get_message_html(d.text, 'no_present'));
									E1gp.lightbox.set_pop_event();
									E1gp.lightbox.set_close_event();
								}
								break;
							case 500:
								if ( typeof d.text == 'undefined' ) return;
								$(S.wishlist+' h5').after(self.get_message_html(d.text, 'faild'));
								break;
						}
					}
				})
			},
			get_unit_html : function(data){
				var self = this;
				return config.html.success.replace(/\{\#(\w+)\#\}/g, function () {
					var key = arguments[1];
					if (key === 'link_url') return data.URL;
					if (key === 'img_url') return data.IMAGE;
					if (key === 'title') return data.TITLE.truncate(30);
					if (key === 'price') return data.PRICE;
					return '';
				});
			},
			get_message_html : function(message, type){
				return config.html[type].replace(/\{\#(\w+)\#\}/g, function () {
					var key = arguments[1];
					if (key === 'message') return message;
					return '';
				});
			}
		}
	})();
	
	E1gp.lightbox = (function(){
		var config;
		
		return {
			init : function(settings){
				config = settings;
				this.set_pop_event();
				this.set_close_event();
			},
			// lightboxを開くためのイベント
			set_pop_event : function(){
				var self = this;
				var S = config.selector;
				$(S.pop_link).unbind().click(function(e){
					e.preventDefault();
					
					var type
					if ( type = $(this).attr('id').match(config.regex.is_popup) ) {
						if ( typeof type == 'object' && typeof type[1] == 'string' ) {
							var type = type[1];
							if ( config.map.list[type] ) type = config.map.list[type];
							
							setTimeout(function(){
								$('#external_mylisence_swf').css('visibility', 'hidden');
							}, 0);
							
							$(S.lightbox.all_content).show();
							$(S.lightbox.overlay).show();
							$(S.lightbox.all_content+' .'+type)
								.show().find('.select_pop').jcombox();
							
							if ( type == 'cartype' ) {
								$('#displacement_id').css('width', '250px');
								$('#sale_start').css('width', '200px');
								$('#mission_type').css('width', '200px');
							}
							
							E1gp.form.init(config);
							E1gp.commons.sort_jcombox_zindex();
						}
					}
				});
			},
			// lightboxを閉じるためのイベント
			set_close_event : function(){
				var L = config.selector.lightbox;
				$(L.btn_close).unbind().click(function(e){
					e.preventDefault();
					$(L.overlay).hide();
					$(L.content).hide();
					$(L.all_content).hide();
					$('#external_mylisence_swf').css('visibility', 'visible');
				});
			}
		}
	})();
	
	E1gp.commons = (function(){
		var config;
		var swf_settings = {
			
		}
		
		return {
			init : function(settings){
				config = settings;
				
				this.resize_pop_window();
				this.judgment_swf_write_page();
				
				if ( $('.select').length != 0 ) {
					$('.select').jcombox();
					E1gp.commons.sort_jcombox_zindex();
				}
				if ( $('input:checkbox:not([safari])').length != 0 ) $('input:checkbox:not([safari])').checkbox();
				if ( $('input[safari]:checkbox').length != 0 ) $('input[safari]:checkbox').checkbox({cls:'jquery-safari-checkbox'});
				if ( $('input:radio').length != 0 ) $('input:radio').checkbox({cls:'jquery-checkbox-radio'});
			},
			// マルチバイトの文字数カウント
			mb_strlen : function(str){
				var strlen = 0 ;
				
				for (var i=0; i<str.length; i++) {
					if (escape(str.charAt(i)).length == 1 ) {
						strlen++;
					} else if (escape(str.charAt(i)).length > 2 ) {
						strlen = strlen + 2;
					}
				}
				return strlen;
			},
			// jcombox用の高さと幅を指定
			show_select_box : function(node, count, max_length){
				var S = config.selector;
				var P = config.prefix;
				if ( count > P.limit ) count = P.limit;
				var width  = max_length * P.lang_width + P.margin_width;
				var height = count * P.lang_height;
				
				$(S.select_menu, node).css({
					'width'  : width,
					'height' : height
				})
				$(node).css('width', width).show();
			},
			// ページによって書き出すswfを切り替える
			judgment_swf_write_page : function(){
				var body = $('body');
				var swf_info;
				
				if ( body.hasClass('toppage') ) {
					swf_info      = config.swf.toppage;
					swf_info.type = 'toppage';
				} else if ( body.hasClass('mylisence') || body.hasClass('otherlisence') ) {
					if ( $('#blockLisence').length == 1 ) {
						var S = config.selector;
						swf_info = config.swf.mylisence.avatar;
						
						var color      = $(S.input_avatar_color).val();
						var type       = $(S.avatar_type+':checked').val() || $(S.avatar_type_hidden).val();
						var level      = $(S.avatar_level).val();
						var level_type = $(S.avatar_level_type).val();
						
						if ( !color || !type || !level || !level_type ) return;
						
						swf_info.flashvars = {
							'color'      : color,
							'type'       : type,
							'level'      : level,
							'level_type' : level_type
						}
					} else {
						swf_info = config.swf.mylisence.graph;
					}
					swf_info.type = 'mylisence';
				} else if ( body.hasClass('driverslist') ) {
					swf_info      = config.swf.driverslist;
					swf_info.type = 'driverslist';
				}
				this.write_swf(swf_info);
			},
			// swfを書き出す共通の処理
			write_swf : function(swf_info){
				var S = swf_info || {};
				var flashvars = S.flashvars || {};
				S.flashvars = $.extend(flashvars, {
					_e1gp : this.get_login_cookie(),
					e1id  : this.get_others_id()
				});
				S.params = {};
				S.params.wmode = S.wmode || 'window';
				S.params.allowscriptaccess = 'always'
				S.attributes = {
					id   : 'external_'+S.type+'_swf',
					name : 'external_'+S.type+'_swf'
				}
				
				if ( $('#'+S.target).length == 1 ) {
					swfobject.embedSWF(
						S.path,
						S.target,
						S.width,
						S.height,
						"9.0.0",
						"/swf/src/expressInstall.swf",
						S.flashvars,
						S.params,
						S.attributes
					);
					if ( $('#blockLisence').length == 1 ) $('#'+S.attributes.id).css('vertical-align','top');
				}
			},
			get_login_cookie : function(){
				var cookie = $.cookie(config.cookie.name);
				return ( cookie ) ? cookie : '';
			},
			get_others_id : function(){
				return $(config.selector.otherid).val() || '';
			},
			sort_jcombox_zindex : function(){
				var zindex = $('.jcombox').length + 5;
				$.each($('.jcombox'), function(){
					$(this).css('z-index', zindex);
					zindex--;
				});
			},
			// ieの透過処理 & ie6のposition:fixed
			resize_pop_window : function(){
				var lightbox = config.selector.lightbox;
				
				if ( $.browser.msie )
					$(lightbox.overlay).css('filter','alpha(opacity=60)');
				
				if (!($.browser.msie && $.browser.version <= 6)) return;
				
				var selector = [lightbox.all_content, lightbox.overlay].join(',');
				$(window).unbind().bind('resize', function(){
					$(selector).css({
						'position' : 'absolute',
						'width'    : $(window).width(),
						'height'   : $(window).height()
					});
				});
				
				this.set_expression(lightbox.all_content);
				this.set_expression(lightbox.overlay);
				
				$(window).resize();
			},
			// expressionのイベントセット
			set_expression : function(node, top, left){
				top = top || 0;
				left = left || 0;
				if ( $(node).length == 0 ) return;
				$(node).get(0).style.setExpression(
					'behavior', 'E1gp.commons.fixed(this,'+top+','+left+')'
				);
			},
			// behaviorイベント時の処理
			fixed : function(el, top, left){
				el.style.top  = (document.body.scrollTop || document.documentElement.scrollTop) + top + 'px';
				el.style.left = (document.body.scrollLeft || document.documentElement.scrollLeft) + left + 'px';
			}
		}
	})();
}

$(function(){
	var settings = {};
	var S = settings;
	
	S.prefix = {
		avatar_img     : '/e1gp/images/form/avatar_preview_',
		avatar_img_ext : '.gif',
		hover_img      : '_on',
		kanagawa_id    : 14,
		lang_width     : 10,
		lang_height    : 20,
		margin_width   : 40,
		limit          : 10
	}
	
	S.selector = {
		maker_node         : '#maker_id',
		maker_id           : '#maker_id input:hidden',
		maker_option       : '#maker_id div.menu a',
		maker_name         : '#makerNameText',
		maker_non_select   : '#maker_id div.menu a[rel^=0]',
		car_node           : '#car_id',
		car_id             : '#car_id input:hidden',
		car_option         : '#car_id div.menu a',
		car_name           : '#carNameText',
		city_node          : '#city_id',
		city_id            : '#city_id input:hidden',
		city_option        : '#city_id div.menu a',
		local_node         : '#local_id',
		local_id           : '#local_id input:hidden',
		//local_option       : '#local_id div.menu a',
		select_menu        : 'div.menu',
		avatar_type        : '#avatarType input:radio',
		avatar_image       : '#avatarImage',
		avatar_color       : 'ul.avatarColor li a',
		avatar_type_hidden : '#avatarTypeHidden',
		input_avatar_color : '#avatarColor',
		avatar_level       : '#avatarLevel',
		avatar_level_type  : '#avatarLevelType',
		pop_link           : 'a[id^="pop_"]',
		error_node         : '[class*="err"]',
		lightbox : {
			all_content    : '#popWindow',
			content        : '#popWindow div.lightbox',
			overlay        : '#popWindowOverlay',
			btn_close      : 'a.btnClose'
		},
		ganre_flag         : '#ganre_flag',
		ganre              : '#ganre input:checkbox',
		user_id            : '#user_id',
		wishlist           : '#blockPresent div.presentlist',
		otherid            : '#e1id'
	}
	
	S.regex = {
		is_unhover_img : new RegExp(/(.*)(\.jpg|\.gif|\.png)$/),
		is_hover_img : new RegExp(/\_on\.(?:jpg|gif|png)$/),
		is_popup : new RegExp(/^pop\_(.*)$/)
	}
	
	S.map = {
		list : {
			avatar_img   : 'avatar',
			displacement : 'cartype',
			spec         : 'cartype'
		}
	}
	
	S.swf = {
		toppage : {
			path   : '/e1gp/swf/E1GP_Top/Base.swf',
			width  : 948,
			height : 500,
			target : 'flashContent'
		},
		mylisence : {
			avatar : {
				path   : '/e1gp/swf/E1GP_Avatar/Avatar.swf',
				width  : 270,
				height : 270,
				target : 'flashContent'
			},
			graph : {
				path   : '/e1gp/swf/E1GP_MyLicense/Base.swf',
				width  : '100%',
				height : '100%',
				target : 'flashContent'
			}
		},
		driverslist : {
			path   : '/e1gp/swf/E1GP_DriverList/Base.swf',
			width  : 948,
			height : 567,
			target : 'flashContent'
		}
	}
	
	S.cookie = {
		name : '_e1gp'
	}
	
	S.api = {
		address  : '/e1gp/cgi/api/address.cgi',
		car      : '/e1gp/cgi/api/car.cgi',
		wishlist : '/e1gp/cgi/api/Recommend.cgi'
	}
	
	S.message = {
		ganre_over : 'ジャンルは3つまでしか選択できません。',
		otherlisence : '設定されている条件に合うものがありませんでした。'
	}
	
	S.html = {
		success : [
			'<dl class="unit">',
			'<dt>',
			'<a target="_blank" href="{#link_url#}">{#title#}</a></dt>',
			'<dd class="img">',
			'<table><tr><td>',
			'<a target="_blank" href="{#link_url#}"><img alt="{#title#}" src="{#img_url#}"/></a>',
			'</td></tr></table>',
			'</dd>',
			'<dd class="price">{#price#}</dd>',
			'</dl>'].join(''),
		no_present : '<p class="alignC unit">{#message#}<a id="pop_present" class="link" href="/DUMMY">変更</a></p>',
		faild : '<p class="alignC unit">{#message#}</p>'
	}
	
	E1gp.form.init(S);
	E1gp.lightbox.init(S);
	E1gp.commons.init(S);
	E1gp.api.init(S);
	E1gp.form.check_errors();
	
	if ( $('body').hasClass('mylisence') || $('body').hasClass('otherlisence') ) E1gp.api.get_wishlist();
});

String.prototype.truncate = function(to) {
  var str = this.toString();
  return str.length > to ? str.slice(0, to)+'...' : str;
};