// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

// Yahoo JavaScript 地図 V3 縮尺計算
// getLayer({width: 800, height: 400}, {lat: 35.0000, lng: 134.000}, {lat: 35.0001, lng: 134.0001});
var YMAP_SCALES = [750, 1500, 3000, 6000, 8000, 16000, 21000, 40000, 75000, 150000, 300000, 480000, 750000, 1500000, 3000000, 6000000, 12000000, 24000000, 48000000];
function getLayer(size, minLatLng, maxLatLng) {
    var ret = getDistance(minLatLng, maxLatLng);
    // Yahoo JavaScript 地図 V3 において、1/1の縮尺とすると 1m = 3000px
    var fraction_x = ret.x * 3000 / size.width;
    var fraction_y = ret.y * 3000 / size.height;
    var fraction = Math.max(fraction_x, fraction_y);
    for(var i=0; i < YMAP_SCALES.length; i++) {
	var scale = YMAP_SCALES[i];
	var layer = i + 1;
	if(scale > fraction)
	    return layer;
    }
    return YMAP_SCALES.length;
}

// 2点間の距離を計算
// var ret = getDistance(latlng1, latlng2);
function getDistance(latlng1, latlng2) {
    var A = 6378137;
    var dx = A * toRadian(latlng2.lng - latlng1.lng) * Math.cos(toRadian(latlng1.lat));
    var dy = A * toRadian(latlng2.lat - latlng1.lat);
    var l = Math.sqrt(dx * dx + dy * dy);
    var theta = Math.atan(dy / dx);
    return {x:Math.abs(dx), y:Math.abs(dy), l:l, theta:theta};
}

function toRadian(angle) {
    return (Math.PI / 180.0 * angle);
}

// 検索地図
function appendMap(mapId, lat, lng, layer, callback) {
    loadScript('yahoomap', 'http://map.yahooapis.jp/MapsService/js/V3/?appid=kawaraban');
    wait('YahooMapsCtrl', function() {
	var ymap = new YahooMapsCtrl(mapId, lat + ", " + lng, layer, YMapMode.MAP, YDatumType.WGS84);
	callback(ymap);
    });
}

// スクリプトの読み込み
function loadScript(id, url) {
    var script = $('#'+id);
    if(script.length > 0) return false;
    script = $('<script type="text/javascript"></script>');
    script.attr('id', id);
    script.attr('src', url);
    script.appendTo('body');
    return true;
}

// 角度を方角に変換
// 北を0度とし、時計回りに
function degrees2direction(degree) {
    if(degree > 337.5 || degree <= 22.5) 
	return "北";
    else if (22.5 < degree && degree <= 67.5)
	return "北東";
    else if (67.5 < degree && degree <= 112.5)
	return "東";
    else if (112.5 < degree && degree <= 157.5)
	return "南東";
    else if (157.5 < degree && degree <= 202.5)
	return "南";
    else if (202.5 < degree && degree <= 247.5)
	return "南西";
    else if (247.5 < degree && degree <= 292.5)
	return "西";
    else
	return "北西";
}

// Cookie読み書き
// setCookie('query', 'キー１=値１&キー２=値２')
// getCookie('query');  => "キー１=値１&キー２=値２"
function getCookie(key){
    var str = " " + document.cookie + ';';
    var last = 0;
    var next = 0;
    var len = str.length;
    while(last < len){
	next = str.indexOf(';', last);
	var record = str.substring(last + 1, next);  // ; の1文字前まで取り出す
	var index = record.indexOf('=');
	if(record.substring(0, index) == key){
	    return(unescape(record.substring(index + 1, record.length)));
	}
	last = next + 1;
    }
    return('');
}

// setCookie(キー, 値, 永続フラグ);
// 第3引数に数値を設定すると、数値分後までのCookieとなる
function setCookie(key, val, permanent){
    if(typeof(val) == 'undefined' || val == null)
	val = '';
    var str = key + '=' + escape(val) + '; ';
    if(typeof(permanent) == 'boolean' && permanent == true){
	str += 'expires=Tue, 31-Dec-2030 23:59:59; ';
    }else if(typeof(permanent) == 'number'){
	var date = new Date();
	date.setTime(date.getTime() + permanent * 60 * 1000);
	var year = date.getYear();
	if(year < 1900)
	    year += 1900;
	
	var Mname = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
	var Dname = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];

	var day = date.getDate();
	var hour = date.getHours();
	var minute = date.getMinutes();
	var second = date.getSeconds();
	if(day < 10)
	    day = '0'+day;
	if(hour < 10)
	    hour = '0'+hour;
	if(minute < 10)
	    minute = '0'+minute;
	if(second < 10)
	    second = '0'+second;
	
	str += 'expires='+Dname[date.getDay()]+', '+day+'-'+Mname[date.getMonth()]+'-'+year+' '+hour+':'+minute+':'+second+'; ';
    }
    document.cookie = str;
}

function saveCurrentUrl(name){
    name = name || 'backurl';
    setCookie(name, window.location.href);
}

function wait(a,func){
  var check = 0;
  try{
    eval("check = " + a);
  }catch(e){
  }
  if(check){
    func()
  }else{
    var f = function(){wait(a,func)};
    setTimeout(f,100);
  }
}

function request(id, url, callback) {
    var query = $('#'+id).serialize();
    startLoading();
    $.ajax({
        type: "GET",
        url: url,
        data: query,
        dataType: "script",
        success: function(msg) {
            endLoading();
            if(typeof(callback) == 'function')
		callback();
        },
        error: function(msg) {
            endLoading();
        }
    });
}

function through_enter(event) {
    if(event.keyCode == 13) {
        return false;
    } else {
        return true;
    }
}

function catchEnter(event) {
    return !through_enter(event);
}

var startLoading = function(){
    $('#loading').css('display', 'block');
};

var endLoading = function(){
    $('#loading').css('display', 'none');
}

/* タグオートコンプリート初期化 */
function setupTagSuggest(id, auto_complete_id, items) {
    if($('#' + auto_complete_id).length > 0) {
        new Suggest.LocalMulti(id,
                               auto_complete_id,
                               items,
                               {
                                   interval: 100,
                                   delim: ' '
                               })
    }
}

/* タグ編集 */
function updateTag(container, url) {
    var divs = document.getElementsByClassName('tag', document.getElementById(container), 'div') || [];
    var tags = [];
    for(var i = 0; i < divs.length; i++) {
        tags.push(divs[i].innerHTML);
    }
    var token = $('input[@name="authenticity_token"]').val();
    startLoading();
    $.ajax({
        type: "PUT",
        url: url,
        data: 'tag='+encodeURI(tags.join(' ')) + '&authenticity_token=' + token,
        dataType: "script",
        success: function(msg) {
            endLoading();
        },
        error: function(msg) {
            endLoading();
        }
    });
}

function addTagFromField(source, container) {
    var newTag = $('#' + source).val();
    var tags = newTag.replace('　', ' ').split(' ');
    for(var i = 0; i < tags.length; i++) {
	addTag(tags[i], container);
    }
    $('#' + source).val('');
}

function addTag(tag, container) {
    var escapedTag = tag.replace('<', '&lt;').replace('>', '&gt;').replace('　', ' ').replace(' ', '');
    if(escapedTag.length == 0) return;

    var tagDiv = document.createElement('div');
    tagDiv.id = tag;
    if($('#' + tag).length > 0) return;

    var data = document.createElement('div');
    data.style.width = '150px';
    try{data.style.styleFloat = 'left';}catch(e){};
    try{data.style.cssFloat = 'left';}catch(e){};
    data.className = 'tag';
    data.innerHTML = escapedTag;
    tagDiv.appendChild(data);

    var button = document.createElement('input');
    button.type = 'button';
    button.value = "削除";
    $(button).click(function(){removeTag(tag);});
    tagDiv.appendChild(button);

    $('#' + container).append(tagDiv);
}

function removeTag(tag) {
    $('#' + tag).remove();
}

document.getElementsByClassName = function(className, pElement, tagName){
    var d = document, nodes = [], item;
    try { // XPathをサポートしているならこれを使う
        var xp = d.evaluate(
            './/'+(tagName || '*')+'[contains(concat(" ", @class, " "), " '+className+' ")]',
            (pElement || d), null, XPathResult.ANY_TYPE, null
        );
        for (item = xp.iterateNext(); item; item = xp.iterateNext()){
            nodes.push(item);
        }
    } catch(e){ // そうでなければ地道にDOM解析
        var cls, items = (pElement || d).getElementsByTagName((tagName || '*'));
        for(var i = 0, l = items.length; i < l; i++){
            item = items[i];
            if(item.className){
                cls = item.className.split(/¥s+/);
                for(var j = 0, k = cls.length; j < k; j++){
                    if(cls[j]==className){
			nodes[nodes.length] = item; break;
                    }
                }
            }
        }
    }
    return nodes.length > 0 ? nodes : null;
}

function createPopupWindow(url, w, h) {
        switch (arguments.length) {
   case 1: w = 800;
   case 2: h = 600;
 }

        x = (screen.width - w) / 2;
        y = (screen.height - h) / 2;
  obj = window.open(url, "popup", 'width='+w+',height='+h+',scrollbars=yes');
        obj.moveTo(x,y);
  obj.focus();

  return false;
}

// submitを押した結果をポップアップウインドウに表示
function withPopupWindow(obj) {
        switch (arguments.length) {
   case 1: w = 800;
   case 2: h = 600;
 }
 x = (screen.width - w) / 2;
        y = (screen.height - h) / 2;
  wobj = window.open("", "popup", 'width='+w+',height='+h+',scrollbars=yes');
  obj.target = "popup";
  wobj.focus();
  return false;
}

function update_hours(target_field_id, hour_field_id, minute_field_id) {
    if($('#'+hour_field_id).val() == '') {
        $('#'+target_field_id).val('');
    } else {
        $('#'+target_field_id).val($('#'+hour_field_id).val() * 60 + $('#'+minute_field_id).val() * 1);
    }
}


function floatToMapFan(value) {
    var di = Math.floor(value);
    var dd = value - di;
    var dm = dd * 60;
    var ds = (dd * 60 - Math.floor(dm)) * 60
    dms = (dd * 60 * 60 - Math.floor(dm) * 60 - Math.floor(ds)) * 60

    var mapfan = "" + di + "." + Math.floor(dm) + "." + Math.floor(ds) + "." + Math.floor(dms)
    return mapfan;
}

function sendKoKoMail(data) {
    var title = data['title'] || "";
    var mapFanLat = floatToMapFan(data['lat']);
    var mapFanLng = floatToMapFan(data['lng']);
    var kokoUrl = "http://kokomail.mapfan.com/receivew.cgi?MAP=E"+mapFanLng+"N"+mapFanLat+"&ZM=9&CI=R";
    top.window.location.href = "mailto:?subject=" + title + "&body=" + kokoUrl;
}

function tabPagination(scrollTo, url){
    startLoading();
    $.ajax({
        type: "GET",
        url: url,
        dataType: "script",
        success: function(msg) {
            endLoading();
	    $('#'+scrollTo).ScrollTo(1000, 'easeout');
        },
        error: function(msg) {
            endLoading();
	    $('#'+scrollTo).ScrollTo(1000, 'easeout');
        }
    });
}

// ログインチェック・書き換え処理
function checkLogin(url, option) {
    $.ajax({
	type: "GET",
	url: url+'?'+(new Date()).getTime(),
	dataType: "json",
	success: function(userdata) {
	    if(userdata.error == 0) {
		if(option.success) option.success(userdata);
	    } else {
		if(option.failure) option.failure(userdata);
	    }
	}
    });
}

// HTML エスケープ
function escapeHTML(str) {
    var tmp = str;
    tmp = tmp.replace('<', '&lt;');
    tmp = tmp.replace('>', '&gt;');
    return tmp;
}

// GMap
// 現在地から目的地の方向（角度）を計算する
function calcYaw(fromLatLng, toLatLng) {
    if (fromLatLng.equals(toLatLng)) {
        return -1;
    }

    var lat_f = fromLatLng.lat();
    var lng_f = fromLatLng.lng();
    var lat_t = toLatLng.lat();
    var lng_t = toLatLng.lng();

    var yaw = 90 - Math.atan2(lat_t - lat_f, lng_t - lng_f) * 180 / Math.PI;
    if (yaw < 0) {
        yaw += 360;
    }

    return yaw;
}
