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 {
            if ( body.hasClass('lisenceEcoscore') ) {
              swf_info = config.swf.mylisence.scoregraph;
            } 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';
                } else if ( body.hasClass('scoreranking') ) {
                    swf_info      = config.swf.scoreranking;
                    swf_info.type = 'scoreranking';
        }
                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'
            },
        scoregraph : {
                path   : '/e1gp/swf/E1GP_ScoreGraph/Base.swf',
                width  : '100%',
                height : '100%',
                target : 'flashContent'
            }
        },
        driverslist : {
            path   : '/e1gp/swf/E1GP_DriverList/Base.swf',
            width  : 948,
            height : 567,
            target : 'flashContent'
        },
        scoreranking : {
            path   : '/e1gp/swf/E1GP_ScoreRanking/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') ) {
      if (!$('body').hasClass('lisenceEcoscore')) {
        E1gp.api.get_wishlist();
      }
    }
});

String.prototype.truncate = function(to) {
  var str = this.toString();
  return str.length > to ? str.slice(0, to)+'...' : str;
};