//あいう
/**
 * アプリケーションインデックスファイル
 *
 * @dependency jquery-1.3.2
 * @charset utf-8
 * @author ishii <ishii[at]s-cubism[dot]jp>
 */

//---------------------------------------------
// グローバルオブジェクト生成
//---------------------------------------------
var $c = ("console" in window && "log" in console)? console.log: function(v){alert(v);};
var KN = (function(){

    // Environments and configs setting.
    var baseDir = "/";

    // Global object setting.
    var app = {

        /** ボタンに確認ダイアログ機能を付加する */
        attachConfirming: function(id, opts){

            opts = opts || {};

            var promptText = '入力した内容を送信します。\n\n　　よろしいですか？';
            if ("promptText" in opts) promptText = opts.promptText;

            var isUserRegistration = false
            if (promptText === "__user_registration") isUserRegistration = true;

            var emailId = "id_email";
            if ("emailId" in opts) emailId = opts.emailId;

            var button = $('#' + id);
            button.click(function(){

                // HTML要素へ特殊な値が設定されていた場合は、動作させない
                // attachAgreementChecker でイベントを複数つけるため
                if ('__disabled_attach_confirming' in button.get(0)
                    && button.get(0).__disabled_attach_confirming === true) {
                    return false;
                };

                if (isUserRegistration) {
                    promptText = "メールアドレスを\n\n" + $('#' + emailId).val() + "\n\nで登録します。\n\nお間違えはありませんか？";
                };

                var yn = confirm(promptText);

                if (yn) {
                    // 間を入れないとIE6で指定した直後から無効になり送信できなくなる
                    // .click書き換えでも同様だった
                    setTimeout(function(){
                        button.attr("disabled", true);
                    }, 50);
                };
                return yn
            });
        },

        /** チェック無しにはボタンを有効に出来ない機能を付与する */
        attachAgreementChecker: function(buttonId, checkboxId){
            var button = $('#' + buttonId);
            var checkbox = $('#' + checkboxId);

            // disabled属性を使うと下記無効時のイベントを起こせない
            var disableWithAlert = function(){
                alert('個人情報取扱い同意書をご確認の上、\n「同意する」へチェックをお願いいたします。');
                return false;
            };

            button.click(disableWithAlert);
            button.get(0).__disabled_attach_confirming = true;

            checkbox
                .click(function(){
                    if (checkbox.attr('checked')) {
                        button.unbind('click', disableWithAlert);
                        // !! IE7 で下のコードが動かない !!
                        //delete button.get(0).__disabled_attach_confirming;
                        button.get(0).__disabled_attach_confirming = false;
                    } else {
                        button.click(disableWithAlert);
                        button.get(0).__disabled_attach_confirming = true;
                    };
                })
            ;
        },

        /** URLを解析してGET値のハッシュを返す */
        parseUrlToParameters: function(url){
            var params = {};
            if (/^.+?\?./.test(url)) {
                var pairs = url.replace(/^.+?\?/, '').split('&');
                for (var i = 0; i < pairs.length; i++) {
                    var pair = pairs[i].split('=');
                    params[pair[0]] = ((pair[1] !== undefined)? pair[1]: "");
                };
            };
            return params;
        },

        /** エラーによる例外を上げる */
        raiseError: function(message, opts){
            opts = opts || {};
            throw new Error(message);
        },

        /** 関数のスコープを束縛する、@see prototype.js */
        bind: function(binded, scope){
            return function() {
                    return binded.apply(scope, arguments);
            };
        },

        /** HTML特殊文字をエスケープする、@see prototype.js */
        escapeHTML: function(str){
            var div = document.createElement('div');
            var text = document.createTextNode(str);
            div.appendChild(text);
            return div.innerHTML;
        },

        /** 配列同士を等価演算する */
        mergeArrays: function(a, b){
            return a.sort().toString(a) === b.sort().toString(b);
        },

        /** ある文字数以上の場合は文字を省略して"..."を付記した文字列を返す */
        omitString: function(str, max){
            if (max === undefined) max = 15;
            return str.replace(new RegExp('^(.{' + max + '}).+$'), '$1...');
        }
    };

    // Paths setting.
    app.baseDir = baseDir;
    app.apiDir = app.baseDir + "api/";
    app.jsDir = app.baseDir + "media/js/";
    app.cssDir = app.jsDir + "css/";
    app.imgDir = app.jsDir + "img/";
    app.libDir = app.jsDir + "lib/";
    app.srcDir = app.jsDir + "src/";
    app.dataDir = app.jsDir + "data/";

    return app;
})();


/**
 * お気に入り登録ボタン生成クラス
 */
KN.BookmarkerGenerator = (function(){

    var cls = function(){
    };

    $.extend(cls.prototype, {

        /** @params companyId 会社ID
            isActive true=有効(未登録), false=無効(登録済み) */
        generateTo: function(htmlId, companyId, isActive){
            this._htmlId = htmlId;
            this._companyId = companyId;
            this._isActive = isActive;
            this._initialize();
        },

        _initialize: function(){

            var self = this;

            this._container = $('#' + this._htmlId);

            // 初期のON/OFF切り替え
            var defaultDisplayActive = "none";
            var defaultDisplayNonactive = "block";
            if (this._isActive) {
                defaultDisplayActive = "block";
                defaultDisplayNonactive = "none";
            }

            this._activeBookmarker = $('<a><span></span></a>')
                .attr("class", "off")
                .css("display", defaultDisplayActive)
                .click(function(evt){
                    self._activeBookmarker.css("display", "none")
                    self._nonactiveBookmarker.css("display", "block")
                    opts = {
                        url: KN.apiDir + "bookmark/add/" + self._companyId + "/"
                        ,type: "GET"
                        ,cache: false
                        ,dataType: "text"
                    };
                    $.ajax(opts);
                })
            ;
            this._nonactiveBookmarker = $('<a><span></span></a>')
                .attr("class", "on")
                .css("display", defaultDisplayNonactive)
                .click(function(evt){
                    self._activeBookmarker.css("display", "block")
                    self._nonactiveBookmarker.css("display", "none")
                    opts = {
                        url: KN.apiDir + "bookmark/delete/" + self._companyId + "/"
                        ,type: "GET"
                        ,cache: false
                        ,dataType: "text"
                    };
                    $.ajax(opts);
                })
            ;
            this._container.append(this._activeBookmarker);
            this._container.append(this._nonactiveBookmarker);
        }

    });

    return cls;
})();


/**
 * 口コミ評価ボタン生成クラス
 */
KN.RaterGenerator = (function(){

    var cls = function(){
    };

    $.extend(cls.prototype, {

        /** @params companyId 会社ID
            isActive true=有効(未評価), false=無効(評価済み) */
        generateTo: function(htmlId, companyId, messageId, point, isActive){
            this._htmlId = htmlId;
            this._companyId = companyId;
            this._messageId = messageId;
            this._point = point;
            this._isActive = isActive;
            this._initialize();
        },

        _initialize: function(){

            var self = this;

            this._container = $('#' + this._htmlId);

            this._activeRater = $('<span></span>')
                .append(
                    $('<a></a>').attr("href", "javascript:void(0)")
                )
                .append(
                    $('<span>' + this._point + '</span>')
                )
                .click(function(evt){

                    // 無効状態に変更
                    self._container.empty();
                    self._container.append(self._createNonactiveRater(self._point + 1));

                    opts = {
                        url: KN.apiDir + "message/rate/" + self._companyId + "/" + self._messageId + "/"
                        ,type: "GET"
                        ,cache: false
                        ,dataType: "text"
                    };
                    $.ajax(opts);
                })
            ;

            if (this._isActive) {
                this._container.append(this._activeRater);
            } else {
                this._container.append(this._createNonactiveRater(this._point));
            };

        },

        /** this._pointを参照しないで引数にしてるのは加算することもあるから */
        _createNonactiveRater: function(point){
            return $('<span></span>')
                .append(
                    $('<a></a>')
                        .attr("href", "javascript:void(0)")
                        .attr("class", "good-on")
                )
                .append(
                    $('<span>' + point + '</span>')
                )
            ;
        }
    });

    return cls;
})();


/**
 * タイムライン管理クラス
 */
KN.TimelineManager = (function(){

    var cls = function(htmlId){
        var self = this;
        this._container = $('#' + htmlId);
        this._data = {};
    };

    $.extend(cls.prototype, {

        write: function(){
            var self = this;
            opts = {
                url: KN.apiDir + "member/timeline/"
                ,type: "GET"
                ,cache: false
                ,dataType: "text"
                ,success: function(response){
                    self._data = eval("(" + response + ")");

                    // タイムライン表示物が0の場合
                    if (self._data.timeline.length === 0) {
                        self._container.append($('<div></div>')
                            .text("「お気に入り」や「アラート」登録をした会社の最新情報が表示されます。")
                        );
                    }

                    $.each(self._data.timeline, function(i, v){

                        var content = $('<a></a>')
                            // attr と text の順番を逆にしたら、
                            // IE6でたまにtextがhrefの文字列になるバグが出た
                            .attr('href', v.url)
                            .text(KN.escapeHTML(KN.omitString(v.content, 40)))
                        ;
                        if (v.type === "entry") {
                            content.attr('target', '_blank');
                        }

                        self._container.append(
                            $('<div></div>')
                                .addClass('timeline')
                                .addClass((function(type){
                                    if (type === "message") return "kuchikomi";
                                    if (type === "updated_company") return "edit";
                                    return "news"
                                })(v.type))
                                .append($('<dl></dl>')
                                    .append($('<dt></dt>')
                                        .append($('<a>' + KN.escapeHTML(v.company_business_name) + '</a>')
                                            .addClass('name')
                                            .attr('href', v.company_url)
                                        )
                                    )
                                    .append($('<dd></dd>')
                                        .append(content)
                                        .append('<span class="date">(&nbsp;' + KN.escapeHTML(v.published_at) + '&nbsp;)</span>')
                                    )
                                )
                        );
                    });
                }
            };
            $.ajax(opts);
        }

    });

    return cls;
})();


/**
 * 他サイト検索クラス
 *
 * @dependency
 *   予め Google AJAX Search API を読み込み
 *   loadGoogleAPI メソッドを実行しておくこと
 */
KN.OtherSiteSearcher = (function(){

    OTHER_SITES = {
        // 就職・転職
        'bunnabi': ["ブンナビ！", "bunnabi.jp"]
        ,'rikunabi': ["リクナビ", "rikunabi.com"]
        ,'findjob': ["Find job!", "find-job.net"]
        ,'en-japan': ["エンジャパン", "en-japan.com"]
        ,'green': ["green", "green-japan.com"]
        ,'s-walker': ["就職ウォーカー", "s-walker.net"]
        ,'nikkei': ["日経就職ナビ", "job.nikkei.co.jp"]
        ,'gakujo': ["学情ナビ", "www.gakujo.ne.jp"]
        // ニュース
        ,'yahoo_news': ["Yahoo!ニュース", "headlines.yahoo.co.jp"]
        ,'asahi_com': ["asahi.com", "www.asahi.com"]
        ,'yomiuri_online': ["YOMIURI ONLINE", "www.yomiuri.co.jp"]
        ,'nikkei_net': ["NIKKEI NET", "www.nikkei.co.jp"]
        // コミュニティ
        ,'twitter': ["Twitter", "twitter.com"]
        ,'hatena_bookmark': ["はてなブックマーク", "b.hatena.ne.jp"]
    };

    var cls = function(screenId, companyId, companyName, brandingId){
        var self = this;

        this._screenId = screenId;
        this._companyId = companyId;
        this._companyName = companyName;
        this._links = []; // 他サイト検索リンクオブジェクトリスト

        var controller = new google.search.SearchControl();
        // 下がずれちゃうので、一旦数を減らす
        //controller.setResultSetSize(google.search.Search.LARGE_RESULTSET);

        var options = new google.search.SearcherOptions();
        options.setExpandMode(google.search.SearchControl.EXPAND_MODE_OPEN);
        // 文言内にサイト名を入れたいので clickイベント内で定義する
        //options.setNoResultsString("検索結果はありません");
        this._options = options;

        this._searcher = new google.search.WebSearch();

        controller.addSearcher(this._searcher, options);
        controller.setSearchCompleteCallback(null, function(){
            /** 連打抑止処理 を入れられるなら入れたい */
        });

        google.search.Search.getBranding(document.getElementById(brandingId));
        //初期画像を出す必要があるのでココでは描画しない、1stクリック時に描画
        //this._container.draw(document.getElementById(this._screenId));

        this._controller = controller;
        this._isFirstClick = false;
    };

    $.extend(cls.prototype, {
        generateLinkTo: function(htmlId, otherSiteKey){
            var label = OTHER_SITES[otherSiteKey][0];
            var siteDomain = OTHER_SITES[otherSiteKey][1];
            this._container = $('#' + htmlId);
            this._container.empty();
            evtData = {
                siteKey: otherSiteKey
                ,label: label
                ,siteDomain: siteDomain
                ,companyId: this._companyId
                ,logging: true
            };
            var link = $('<a></a>')
                .text(label)
                // id="__oss_link_{{otherSiteKey}}__" が振られる
                .attr("id", "__oss_link_" + otherSiteKey + "__")
                .attr("href", "javascript:void(0)")
                .bind("click", evtData, KN.bind(this._clickHandler, this))
                .appendTo(this._container)
            ;
            this._links.push(link);
        },
        _clickHandler: function(evt){
            this._searcher.setSiteRestriction(evt.data.siteDomain);
            var query = '"' + this._companyName + '"';
            if (evt.data.siteKey === "twitter") {
                // つぶやき詳細のみ取得するため
                query = '"' + this._companyName + '" -") on Twitter"';
            };
            this._options.setNoResultsString("[ " + evt.data.label + " ] からの検索結果はありません。<br /><br />&#171; リンクをクリックして、他のサイトを検索！");
            this._searcher.execute(query);
            if (this._isFirstClick === false) {
                this._controller.draw(document.getElementById(this._screenId));
                this._isFirstClick = true;
            };
            if (evt.data.logging) {
                opts = {
                    url: KN.apiDir + "other_site_searcher_logging/" + evt.data.companyId + "/" + evt.data.siteKey + "/"
                    ,type: "GET"
                    ,cache: false
                    ,dataType: "text"
                };
                $.ajax(opts);
            }

            // クリック中スタイルを入れる
            $.each(this._links, function(i, v){
                v.css("fontWeight", "normal");
            });
            $("#__oss_link_" + evt.data.siteKey + "__").css("fontWeight", "bold");
        },
        // クリックイベントを起こす、強引にやってるので触るときは要注意
        click: function(otherSiteKey){
            var evt = {
                data: {
                    siteKey: otherSiteKey
                    ,label: OTHER_SITES[otherSiteKey][0]
                    ,siteDomain: OTHER_SITES[otherSiteKey][1]
                    ,companyId: this._companyId
                    ,logging: false
                }
            };
            this._clickHandler(evt)
        }
    });

    cls.loadGoogleAPI = function(){
        google.load("search", "1", {
            "nocss": true,
            "nooldnames": true,
            "langage": "ja"
        });
    };

    return cls;
})();


/**
 * 役に立ったアンケートフォーム生成クラス
 */
KN.QuestionnaireUsefulnessFormGenerator = (function(){

    INPUT_ID = '__js_qufg_button_box__';
    COMPLETED_ID = '__js_qufg_input_box__';

    var cls = function(){
    };

    $.extend(cls.prototype, {

        /** @params companyId 会社ID */
        generateTo: function(htmlId, companyId){
            this._htmlId = htmlId;
            this._companyId = companyId;
            this._initialize();
        },

        _initialize: function(){

            var self = this;

            this._container = $('#' + this._htmlId);

            this._element = $('<div></div>')
                .append($('<div></div>')
                    .attr('id', INPUT_ID)
                    .append($('<input>')
                        .attr({
                            type: 'button'
                            ,value: 'はい'
                        })
                        .bind('click', {yesNo: 'yes'}, KN.bind(this._clickHandler, this))
                    )
                    .append($('<span>&nbsp;&nbsp;&nbsp;&nbsp;</span>'))
                    .append($('<input>')
                        .attr({
                            type: 'button'
                            ,value: 'いいえ'
                        })
                        .bind('click', {yesNo: 'no'}, KN.bind(this._clickHandler, this))
                    )
                )
                .append($('<div>ご協力ありがとうございました。</div>')
                    .attr('id', COMPLETED_ID)
                    .hide()
                )
            ;

            this._container.append(this._element);
        },

        _clickHandler: function(evt){
            opts = {
                url: KN.apiDir + "questionnaire_usefulness_logging/" + this._companyId + "/" + evt.data.yesNo + "/"
                ,type: "GET"
                ,cache: false
                ,dataType: "text"
            };
            $.ajax(opts);
            $('#' + INPUT_ID).hide();
            $('#' + COMPLETED_ID).show();
        }
    });

    return cls;
})();


///**
// * Apr用会社カウンタ
// */
//KN.CompanyCounter = (function(){
//
//    var cls = function(){
//    };
//
//    $.extend(cls.prototype, {
//
//        linkTo: function(htmlId){
//            this._htmlId = htmlId;
//            this._defaultCount = 206400;
//            this._initialize();
//        },
//
//        _initialize: function(){
//            var self = this;
//            this._container = $('#' + this._htmlId);
//            cnt = this._defaultCount;
//            delta = 1;
//
//            self._container.text('206,400');
//setTimeout(function(){
//            timer = setInterval(function(){
//                interval = 10;
//
//                if (cnt > 99999999) {
//                    cnt = 99999999;
//                }
//
//                cntText = cnt + '';
//                cntText = cntText.replace(/^([\d,]+)(\d{6})/, '$1,$2').replace(/^([\d,]+)(\d{3})/, '$1,$2');
//                self._container.text(cntText);
//
//                if (cnt >= 99999999) {
//                    document.location.href = '/april-fools-day-2010/';
//                    self._container.css('color', 'red');
//                    clearInterval(timer);
//                } else {
//                    cnt += delta;
//                    delta += 1;
//                    if (cnt > 230000) {
//                        delta += 10;
//                    }
//                    if (cnt > 350000) {
//                        delta += 100;
//                    }
//                    if (cnt > 5000000) {
//                        delta += 1000;
//                    }
//                    if (cnt > 1000000) {
//                        delta += 10000;
//                    }
//                };
//            }, 10);
//}, 1000);
//        }
//    });
//
//    return cls;
//})();

