// JavaScript

$(function(){
    
    Rollover.initrolloverimages();
    
    if (!window.console)
        window.console = {log:function(){}};
    
    // {$ROOT}にあたるパスを取得
    $(':hidden[name=root]').each(function(){
        Ut.ROOT = $(this).val();
    });
    
    $('div.pagetop a').click(function(){
        $('body').scrollTo($('#header'), 400);
        return false;
    });
    
    initLightbox();
});



/**
 * Lightbox を初期化
 */
function initLightbox(path) {
    $(function(){
        $('a[rel=lightbox]').lightBox({'images':path});
    });
}


/**
 * ポップアップウィンドウクラス
 * 
 * 使用例 (1)<br />
 * var pop1 = new PopupWindow('popup.html');
 * pop1.open({width:500,height:400});
 *
 * 使用例 (2)<br />
 * <a href="popup.html" onclick="(new PopupWindow(this.href)).open({width:200,height:'max'});">open</a>
 * 
 */
var PopupWindow = function(url) {
    if (url)
        this.url = url;
    this.popupwindow = null;
    this.scrollbars = 'yes';
    this.resizable = 'yes';
    this.copyhistory = 'yes';
    this.width = null;
    this.height = null;
    this.left = 'center';
    this.top = 'center';
};

PopupWindow.prototype.open = function(argv) {
    
    var option = {};
    
    if (!argv)
        argv = {};
    
    var lurl = (argv.url) ? argv.url : this.url;
    
    option.width = (argv.width) ? argv.width : this.width;
    option.height = (argv.height) ? argv.height : this.height;
    
    if (option.width && option.width == 'max') 
        option.width = screen.width;
    if (option.height && option.height == 'max') 
        option.height = screen.height;
    
    option.scrollbars = (argv.scrollbars) ? argv.scrollbars : this.scrollbars;
    option.resizable = (argv.resizable) ? argv.resizable : this.resizable;
    option.copyhistory = (argv.copyhistory) ? argv.copyhistory : this.copyhistory;
    
    option.left = (argv.left!=undefined) ? argv.left : this.left;
    if (option.left == 'center')
        option.left = (!isNaN(option.width)) ? (screen.width - option.width) / 2 : null;
        
    option.top = (argv.top!=undefined) ? argv.top : this.top;
    if (option.top == 'center')
        option.top = (!isNaN(option.height)) ? (screen.height - option.height) / 2 : null;
    
    if (option.left)
        option.screenX = option.left;
    if (option.top)
        option.screenY = option.top;
    
    if (this.popupwindow && !this.popupwindow.closed) {
        this.popupwindow.close();
    }
    
    var optionStr = '';
    for (var key in option) {
        if (option[key]!=null)
            optionStr += key+'='+option[key]+',';
    }
    
    // Output to console
    if (window.console) {
        window.console.log(optionStr);
        window.console.log('popup::'+lurl);
    }
    
    this.popupwindow = window.open(lurl, PopupWindow.getNewWindowName(), optionStr);
    return this.popupwindow;
    
};

PopupWindow.sequence = 0;
PopupWindow.getNewWindowName = function(){
    return 'win'+(PopupWindow.sequence++);
};


/**
 * ロールオーバー
 *
 * img要素のclass属性に「rollover」を指定すると、指定されたファイル名に「_over」の接尾語をつけたファイル名がロールオーバーで入れ替わる
 * 
 * 使用例
 * <img src="images/image.jpg" alt="" class="rollover" />
 *
 */
var Rollover = function () {};

Rollover.suffix = '_over';
Rollover.preloadimages = [];
Rollover.overflag = [];

Rollover.overimage = function (obj) {
    if (obj.src && obj.src.indexOf('.') != -1) {
        obj.src = Rollover.getrolloverimagefile(obj.src);
        this.overflag.push(obj);
    }
}
    
Rollover.normalimage = function (obj) {
    var flag = false;
    for (var i in this.overflag) {
        if (this.overflag[i] == obj) {
            flag = true;
            this.overflag[i] = null;
            break;
        }
    }
    if (flag && obj.src && obj.src.indexOf('.') != -1) {
        obj.src = Rollover.getoriginalimagefile(obj.src);
    }
}
    
Rollover.getrolloverimagefile = function (path) {
    var filename = path.substring(0, path.lastIndexOf('.'));
    var extention = path.substring(path.lastIndexOf('.'), path.length);
    return filename + Rollover.suffix + extention;
}
    
Rollover.getoriginalimagefile = function (path) {
    var filename = path.substring(0, path.lastIndexOf('.')-Rollover.suffix.length);
    var extention = path.substring(path.lastIndexOf('.'), path.length);
    return filename + extention;
}

Rollover.initrolloverimages = function() {
    var images = document.getElementsByTagName('img');
    for (var i=0; i<images.length; i++) {
        var classValue = null;
        if (images[i].getAttribute('className'))
            classValue = images[i].getAttribute('className');
        else if (images[i].getAttribute('class'))
            classValue = images[i].getAttribute('class');
        if (classValue != null && classValue.indexOf('rollover') != -1 && images[i].src && images[i].src.indexOf('_over.')==-1) {
            $(images[i]).mouseover(function(){
                Rollover.overimage(this);
            });
            $(images[i]).mouseout(function(){
                Rollover.normalimage(this);
            });
            Rollover.preloadimages[i] = new Image();
            Rollover.preloadimages[i].src = Rollover.getrolloverimagefile(images[i].src);
        }
    }
};



/**
 * Utilities
 */
var Ut = function(){};

Ut.KEY_ESC = 27;
Ut.ROOT = null;


/**
 * PHP版 nl2br の移植
 */
Ut.nl2br = function(str){
    str = escape(str);
    var escapedBreak = escape('<br />');
    str = str.replace(/%0D%0A/g, escapedBreak);
    str = str.replace(/%0A/g, escapedBreak);
    str = str.replace(/%0D/g, escapedBreak);
    return unescape(str);
};


/**
 * PHP版 htmlspecialchars の移植
 */
Ut.htmlspecialchars = function(str){
    str = str.replace(/&/g, '&');
    str = str.replace(/</g, '&lt;');
    str = str.replace(/>/g, '&gt;');
    str = str.replace(/"/g, '"');
    return str;
};


/**
 * 要素を取得
 * @param string elementname 要素名
 * @param Object 属性
 * @return Object
 */
Ut.getElement = function(elementname, attrs){
    var element = $(document.createElement(elementname));
    for (var label in attrs) {
        if (label=='class')
            element.addClass(attrs[label]);
        else if (label=='text')
            element.text(attrs[label]);
        else
            element.attr(label, attrs[label]);
    }
    return element;
};

/**
 * モーダル
 */
var Modal = function(){};

Modal.modalwindow = null;

/**
 * 背景を落とす
 * 
 * マットをクリックしたときに閉じるようにするには、次のようにオプションを渡す。
 * Modal.set({clickable:true});
 */
Modal.set = function(options) {

    // 黒背景を作成
    var blackmat = $('<div class="blackmat"></div>');
    $('body').prepend(blackmat);
    blackmat
        .css('width', $('body').width())
        .css('height', $(window.document).height());
    
    if (options && options.clickable) {
        blackmat.one('click', function(){
            if (options && options.clicked) {
                options.clicked();
            }
            Modal.clear();
            $(this).remove();
        });
    }
};


/**
 * モーダルでウィンドウで表示する
 *
 * オプションでは、要素を指定することで要素の下にウィンドウを表示できる。
 * Moddal.set(source, {below:'div.selectedelement'});
 */
Modal.window = function(source, option){
    
    // 背景がそのままの場合は背景を落とす
    if (!$('div.blackmat').length) {
        if (options && options.clicked) {
            Modal.set({clickable:true, clicked:options.clicked});
        } else {
            Modal.set();
        }
    }
    
    // すでにある場合には削除
    if ($('div.modalwindow').length) {
        $('div.modalwindow').remove();
    }
    
    // モーダルウィンドウを作成
    Modal.modalwindow = $('<div class="modalwindow"></div>');
    Modal.modalwindow.append(source);
    Modal.modalwindow.css('z-index', 100);
    $('body').append(Modal.modalwindow);
    
    Modal.resetPosition((option && option.below));
    
    return Modal.modalwindow;
};

Modal.clear = function() {
    $('div.modalwindow').remove();
    $('div.blackmat').remove();
};

Modal.resetPosition = function(below){
    var scrolltop = 0;
    if (document.documentElement && document.documentElement.scrollTop) {
        scrolltop = document.documentElement.scrollTop;
    } else {
        scrolltop = $('body').scrollTop();
    }
    
    var windowheight = 0;
    if (document.documentElement && document.documentElement.clientHeight) {
        windowheight = document.documentElement.clientHeight;
    } else if (window.innerHeight) {
        windowheight = window.innerHeight;
    }
    
    // 特定の要素の下に表示するとき
    if (below) {
        if (!option.below.jQuery) {
            option.below = $(option.below);
        }
        var offset = option.below.offset();
        var left = offset.left;
        if (left+Modal.modalwindow.width()+10 > $('body').width()) {
            left = $('body').width() - Modal.modalwindow.width() - 10;
        }
        
        var top = offset.top+option.below.height()+8;
        if (top+Modal.modalwindow.height()+10 > scrolltop+windowheight) {
            top = offset.top - Modal.modalwindow.height()-10;
        }
        
        Modal.modalwindow.css('top', top);
        Modal.modalwindow.css('left', left);
    }
    
    // 中央に表示するとき
    else {
        
        if (windowheight) {
            Modal.modalwindow.css('top', scrolltop+(windowheight-Modal.modalwindow.height())/2);
        } else {
            Modal.modalwindow.css('top', scrolltop+20);
        }
        Modal.modalwindow.css('left', ($('body').width()-Modal.modalwindow.width())/2);
        
    }
};


var DateTimePicker = function(){};
DateTimePicker.between = function(date){
    var now = new Date();
    now.setHours(0);
    now.setMinutes(0);
    var splited = date.split('-');
    var selected = new Date(splited[0], splited[1]-1, splited[2]);
    var between = Math.ceil((selected.getTime()-now.getTime())/60/60/24/1000);
    return between;
}
