/*
 *  XcScript: For XC system
 *  (c) 2006 ISHIHARA Yoshinori yoshinori@ishihara.ne.jp
 */

var XcJavaScript = { Version: '0.01' };
var gl_sub_window;
var gl_block_onclick = 0;

// エンターキーで送信をしない
function blockEnter(evt) {
    evt = (evt) ? evt : event;
    var elm = (evt.target) ? evt.target :
                             ((evt.srcElement) ? evt.srcElement : null);
    if (elm == null) { return true; }
    var charCode = (evt.charCode) ? evnt.charCode :
                                    ((evt.which) ? evt.which : evt.keyCode);
    if (charCode == 13 || charCode == 3) {
	return false;
    }else{
	return true;
    }
}

// 登録の有無を確認
function confirmUpdate(url) {
    var pars;
    var myAjax = new Ajax.Request(url,
                                 { method: 'post',
                                   parameters: pars,
				   onComplete: execUpdateAjax
                                 });
    return false;
}

// サーバから返答を取得し、確認後、実行
function execUpdateAjax(httpRes) {
    if (httpRes.responseText.match(/^true/)){
        if (!confirm('上書きしてもよろしいですか？')){
	    return false;
        }
    }
    // ダミーで、name=registの要素を追加しないと受けるほうの/<controller>/actionで
    // 意図した動作にならない
    var input = document.createElement("input");
    input.type = "hidden";
    input.name = "regist";
    input.value = "regist";
    document.actionForm.appendChild(input);
    document.actionForm.submit();
}

// 削除の確認
function confirmRemove(elm, button) {
    if (confirm('削除してよろしいですか？')){
	doSubmit(elm, button);
	return true;
    }else{
	return false;
    }
}

// Formの送信
function doSubmit(elm, button) {
    var input = document.createElement("input");
    input.type = "hidden";
    input.name = button
    input.value = 1;
    elm.form.appendChild(input);
    elm.form.submit();
}

// 1行挿入
function insLine(obj, textoff)
{
    /* 下記のDOM構造に<div.unit-box>を複製して、挿入する関数
       <tr><td><input type="text.../></td><td><input../></td></tr> 
       ↑これをコピーして、ここに挿入する
       <tr>
       <td><input.. onClick="insLine(this)" /></td>
       <td><input.. onClick="delLine(this)" /></td>
       <tr>
       　　親<td>の親<tr>の兄弟<tr>をコピーし、爺さんの手前に挿入
    */
    if (document.getElementById && document.createElement) {
	var jisan = obj.parentNode.parentNode;
	var jinew = jisan.cloneNode(true);
	if (textoff) { textOff(jinew); }
	/*    alert("jisan->"+jisan.nodeName+" jinew->"+jinew.nodeName);    */
	jisan.parentNode.insertBefore(jinew, getNextTR(jisan));
	/*                      jisan.parentNode.appendChild(jinew);*/
	/*                      jinew.childNodes[0].pps_uchiwake.focus();*/
	setFocusOnTheFirstInput(jinew);
        var nodeEdit = getElementByClassName(jinew, "nodeEdit");
        setFocusToNodeEdit(nodeEdit);
    }else{
	alert('あなたのブラウザはLevel 1のDOM をサポートしていません。');
    }
}

// 1行を削除
function delLine(obj) {
    if (document.getElementById && document.createElement) {
	var jisan = obj.parentNode.parentNode;
	var table = jisan.parentNode;
	if (getElementNum(table, jisan) > 2)
	    table.removeChild(jisan);
	else
	    textOff(jisan);
    }else{
        alert('あなたのブラウザはLevel 1のDOM をサポートしていません。');
    }
}

// 行を上に
function upLine(obj)
{
    if (document.getElementById && document.createElement) {
	var tr  = obj.parentNode.parentNode;
	var pre = getPreviousTR(tr);
	if (pre) {
	    if (getPreviousTR(pre)){ // タイトル行より前には挿入しない
		pre.parentNode.insertBefore(tr, pre);
	    }
	}
    }else{
	alert('あなたのブラウザはLevel 1のDOM をサポートしていません。');
    }
}

// 行を下に
function downLine(obj)
{
    if (document.getElementById && document.createElement) {
	var tr  = obj.parentNode.parentNode;
	var next = getNextTR(tr);
	if (next) {
	    next.parentNode.insertBefore(next, tr);
	}
    }else{
	alert('あなたのブラウザはLevel 1のDOM をサポートしていません。');
    }
}

// ひとつ上の行を取得
function getPreviousTR(obj)
{
    var parent = obj.parentNode;
    var target;
    for (var i=0; i < parent.childNodes.length; i++){
	if (parent.childNodes.item(i) == obj){
	    /*      alert("match!");*/
	    return target;
	}
	if (parent.childNodes.item(i).nodeName == 'TR'){
	    target = parent.childNodes.item(i);
	}
    }
    return null;
}

// ひとつ下の行を取得
function getNextTR(obj)
{
    var parent = obj.parentNode;
    var target;
    var match = 0;
    for (var i=0; i < parent.childNodes.length; i++){
	if (match && parent.childNodes.item(i).nodeName == 'TR'){
	    return parent.childNodes.item(i);
	}
	if (parent.childNodes.item(i) == obj){
	    match = 1;
	}
    }
    return null;
}

// dayEditにひとつのnodeEditを残し、残りは削除
function remainOneNodeEdit( obj )
{
    if ( obj.nodeType != '1'/*ELEMENT_NODE*/ )
	return;

    var first_node = 1;
    for ( var i = 0; i < obj.childNodes.length; i++ ) {
    	var child = obj.childNodes.item(i);
        if ( child.className == 'nodeEdit' ) {
            if ( first_node ) {
                first_node = 0;
                continue;
            }
            obj.removeChild( child );
        }
    }
}

// 入力内容をクリアする
function textOff(obj)
{
    if (obj.nodeType != '1'/*ELEMENT_NODE*/)
	return;

    if (obj.nodeName == 'INPUT'){
        var type = obj.getAttribute('type');
        if (type != "button" &&
            obj.className != 'resetSpotInfo'   &&
            obj.className != 'searchSpotInfo'  &&
            obj.className != 'registSpotInfo'  &&
            obj.className != 'resetImageInfo'  &&
            obj.className != 'searchImageInfo' &&
            obj.className != 'registImageInfo' 
        ){
            obj.value = "";
        }
    }

    if (obj.nodeName == 'TEXTAREA')
    	obj.value = "";

    // 写真の解除
    if ( obj.className == 'nodeImage' )
        resetImageInfo( obj );

    for (var i=0; i<obj.childNodes.length; i++)
    	textOff(obj.childNodes.item(i));
}

// 指定されたnameのinputタグのvalueを空にする
function valueOff(obj, name)
{
    if (obj.nodeType != '1'/*ELEMENT_NODE*/)
	return;

    if (obj.nodeName == 'INPUT' && obj.getAttribute('name') == name){
	obj.value = "";
    }
    for (var i=0; i<obj.childNodes.length; i++)
    	valueOff(obj.childNodes.item(i), name);
}

// 先頭の入力欄にカーソルをセットする
function setFocusOnTheFirstInput(elm)
{
    var inputText = getInputText(elm);
    if (inputText) {
	inputText.focus();
    }
}

// 先頭の入力欄を取得
function getInputText(elm)
{
    if (elm == null) {
	return null;
    }
    if (elm.nodeType == '1' &&
	elm.nodeName == 'INPUT' &&
	elm.getAttribute('type') == "text"){
	return elm;
    }
    for (var i = 0; i < elm.childNodes.length; i++) {
	var inputText = getInputText(elm.childNodes.item(i));
	if (inputText) {
	    return inputText;
	}
    }
    return null;
}

//
function moveItem (from, to) {
    var fbox = new Array();
    var tbox = new Array();
    var lookup = new Array();

    // Copy data from 'to' and 'from' boxes into 'tbox' and 'fbox'
    // arrays; if an item in 'from' is selected, it gets moved into
    // 'tbox'.'lookup' holds the values of each option.
    for (i=0; i<to.length; i++) {
        if (to.options[i].value == -1) continue;
        lookup[to.options[i].text] = to.options[i].value;
        tbox[i] = to.options[i].text;
    }
    for (i=0; i<from.length; i++) {
        if (from.options[i].value == -1) continue;
        lookup[from.options[i].text] = from.options[i].value;
        if (from.options[i].selected)
            tbox[tbox.length] = from.options[i].text;
        else
            fbox[fbox.length] = from.options[i].text;
    }

    // Sort both of the arrays, then fill up the selection boxes with
    // the sorted values.
    fbox.sort();
    tbox.sort();
    from.length = 0;
    to.length = 0;

    // This is stupid. Mac IE has a nasty bug where, if a multiple selection
    // box is left empty, it seems to move the other selection box all over
    // the screen. So if the 'from' box is going to be empty, we fill it with
    // an empty option. We then check for this dummy option up above
    // (value == -1) to get rid of it when we don't need it.
    if (fbox.length == 0)
        from[0] = new Option('', -1);
    for (i=0; i<fbox.length; i++)
        from[i] = new Option(fbox[i], lookup[fbox[i]]);
    for (i=0; i<tbox.length; i++)
        to[i] = new Option(tbox[i], lookup[tbox[i]]);
}

// 全ての要素を選択
function selectAll ( s ) {
    for (i=0; i<s.length; i++)
        s.options[i].selected = 1;
}

// 小ウィンドウを生成して、取得内容を表示する
function makeNewWindow( url, elm, width, height ) 
{
    // 関数名変更の互換対策
    makeSubWindow( url, elm, width, height ) 
}

// 小ウィンドウを生成して、取得内容を表示する
function makeSubWindow( url, elm, width, height ) 
{
    // 子ウィンドウのサイズ
    width  = width  ? width : 650;
    height = height ? height: 400;
    var options = "scrollbars, resizable, height="+height+", width="+width;
    // "status" ←ステータスバーをつける場合

    // 子ウィンドウの生成
    if (gl_sub_window) { gl_sub_window.close(); }
    gl_sub_window = window.open( url, "subwind", options );
}

// 親ウィンドウの要素にセットする
function sendToParentWindow( id, name, yomi ) 
{
    opener.document.actionForm.id.value   = id;
    opener.document.actionForm.name.value = name;
    opener.document.actionForm.yomi.value = yomi;
    close();
}

// Route情報検索子ウィンドウを生成
function searchRouteInfo( routeedit )
{
    var url = '/route/search_page?window_type=sub_window';
    makeSubWindow( url, routeedit );
}

// Route情報雛型を該当要素にセット
function setRouteInfo( route )
{
    var routeEdit = getElementByClassName( opener.document, "routeEdit" );
    routeEdit.innerHTML = route.innerHTML;
    autoCompNodeDate( opener.document );
    //    textOffRoute( routeEdit );
}

// Spot情報をセット
function setSpotInfo( spotid, spotname )
{
    var spotblock      = opener.getFocusSpotBlock();
    var input_spotid   = getElementByClassName( spotblock, 'spotid' );
    var input_nodename = getElementByClassName( spotblock, 'nodename' );

    // セット
    input_spotid.value   = spotid;
    input_nodename.value = spotname;

    // ボタンの制御
    changeSpotInfoButtons( spotblock, spotid );
}

// Spot情報検索子ウィンドウを生成
function searchSpotInfo( spotblock )
{
    // FocusFlagをセット
    setFocusToSpotBlock( spotblock );
    var url = '/spot/search_page?window_type=sub_window';
    makeSubWindow(url, spotblock);
}

// Spot情報登録子ウィンドウを生成
function registSpotInfo( spotblock )
{
    // FocusFlagをセット
    setFocusToSpotBlock( spotblock );
    var url = '/spot/regist_page?window_type=sub_window';
    makeSubWindow( url, spotblock, 650, 660 );
}

// Spot情報をサーバのDBに登録
function registSpotInfoAjax( form )
{
    if ( !checkFormSpot( form ) ) {
        return null;
    }
    var url  = "/spot/regist_ajax";
    var pars = createReqParamsSpot( form );
    // IEの場合、method:'get'ではリクエスト送信しなかった
    var myAjax = new Ajax.Request(url,
                                 { method: 'post',
                                   parameters: pars,
				   onComplete: setSpotInfoAjax
                                 });
    // 登録ボタンを隠す
    disableRegistButton()
}

// サーバからのSpot情報を送信ボタンにセット
function setSpotInfoAjax( httpRes )
{
    var text = httpRes.responseText;
    //    alert(text);
    var str = text.replace(/\n|\r/gi, "").replace(/<\?xml.+\?>/i, "");
    var reg_spotid = new RegExp( "<spotid>(.*)</spotid>", "i" );
    var spotid = reg_spotid.exec( str );
    var reg_spotname = new RegExp( "<spotname>(.*)</spotname>", "i" );
    var spotname = reg_spotname.exec( str );

    // 貼付けボタンを有効にする
    enableSendButton( spotid[1], spotname[1] );

    // 再読み込み
    loadClusters();
}


// 貼付けボタンを有効にする
function enableSendButton ( spotid, spotname ) 
{
    var onclick_func = "setSpotInfo('"+spotid+"','"+spotname+"');";
    var buttonSecs = getLikeElements('li', 'class', 'buttonSec');
    for (var i = 0; i < buttonSecs.length; i++){
        var bS = buttonSecs[i];
        var button;
        if (button = getElementByClassName(bS, 'send_button')){
            button.style.display = '';
            // OK->FF,Sa  NG->IE
            ///button.setAttribute('onclick', onclick_func);
            // OK->IE NG->Sa,FF
            //button.setAttribute('onclick', new Function(onclick_func)); 
            button.onclick = new Function( onclick_func ); 
	    }
        if (button = getElementByClassName( bS, 'reset_button' )){
            //            button.style.display = '';
        }
    }
}

// 登録ボタンを隠す
function disableRegistButton( )
{
    var buttonSecs = getLikeElements('li', 'class', 'buttonSec');
    for (var i = 0; i < buttonSecs.length; i++){
        var button = getElementByClassName(buttonSecs[i], 'regist_button');
        if (button){ button.style.display = 'none'; }
    }
}

// サーバからのSpot情報を送信ボタンにセット
function resetSpotInfoAjax( form )
{
    // 入力をクリア
    form.spotname.value = '';
    form.spotyomi.value = '';
    form.lng.value = '';
    form.lat.value = '';
    form.height.value = '';
    form.todoufuken.value = '';
    form.zumei.value = '';


    // 登録ボタンを復活
    var buttonSecs = getLikeElements('li', 'class', 'buttonSec');
    for (var i = 0; i < buttonSecs.length; i++){
        var bS = buttonSecs[i];
        var button;
        if (button = getElementByClassName(bS, 'send_button')){
            button.style.display  = 'none';
            button.setAttribute('onclick', '');
	}
        if (button = getElementByClassName(bS, 'reset_button')){
            button.style.display = 'none';
	}
        if (button = getElementByClassName(bS, 'regist_button')){
            button.style.display = '';
	}
    }
}

// SpotのFormの内容をチェック
function checkFormSpot(form)
{
    var ret = 1;
    var msg = '';
    if (!form.spotname.value) { msg += '地点名 '; ret = 0; }
    if (!form.lng.value) { msg += '経度 '; ret = 0; }
    if (!form.lat.value) { msg += '緯度 '; ret = 0; }
    if (!ret) { alert(msg+"は必須項目です!"); }
    return ret;    
}

//
function createReqParamsSpot(form) {
    var ret = 'spotname=' + form.spotname.value
            + '&lat=' + form.lat.value
            + '&lng=' + form.lng.value;

    if (form.spotyomi.value)
        ret += ( '&spotyomi=' + form.spotyomi.value );
    if (form.height.value)
        ret += ( '&height=' + form.height.value );
    if (form.todoufuken.value)
        ret += ( '&todoufuken=' + form.todoufuken.value );
    if (form.zumei.value)
        ret += ( '&zumei=' + form.zumei.value );
    return ret;
}

// Spot情報をクリア
function resetSpotInfo( spotblock )
{
    var input_spotid   = getElementByClassName( spotblock, 'spotid' );
    input_spotid.value = '';
    //    var input_spotname = getElementByClassName( spotblock, 'spotname' );
    //    input_spotname.value = '';
    var input_nodename = getElementByClassName( spotblock, 'nodename' );
    input_nodename.value = '';
    // ボタンの制御
    changeSpotInfoButtons( spotblock );
}

//
function toggleSpotFormReadonly( readonly )
{
    $( 'spotname' ).readonly = readonly;
    $( 'lng' ).readonly = readonly;
    $( 'lat' ).readonly = readonly;
    $( 'height' ).readonly = readonly;
    $( 'todoufuken' ).readonly = readonly;
    $( 'zumei' ).readonly = readonly;

    /*
    if ( readonly ) {
        $( 'spotname' ).className = 'readonly';
        $( 'spotyomi' ).className = 'readonly';
        $( 'lng' ).className = 'readonly';
        $( 'lat' ).className = 'readonly';
        $( 'height' ).className = 'readonly';
        $( 'todoufuken' ).className = 'readonly';
        $( 'zumei' ).className = 'readonly';
    } else {
        $( 'spotname' ).className = '';
        $( 'spotyomi' ).className = '';
        $( 'lng' ).className = '';
        $( 'lat' ).className = '';
        $( 'height' ).className = '';
        $( 'todoufuken' ).className = '';
        $( 'zumei' ).className = '';
    }
    */
}

// Focus SpotBlockを取得
function getFocusSpotBlock()
{
    var nodeEdit = getFocusNodeEdit();
    if (nodeEdit){
        return getElementByClassName(nodeEdit, "spotBlock");
    }
    return null;
}

// Focus NodeImageを取得
function getFocusNodeImage()
{
    var nodeEdit = getFocusNodeEdit();
    if (nodeEdit){
        return getElementByClassName(nodeEdit, "nodeImage");
    }
    return null;
}

// Focus NodeEditを取得
function getFocusNodeEdit()
{
    return getFocusTag("div", "class", "nodeEdit");
}

// Focus Tagを取得
function getFocusTag(tagName, attrName, attrValue)
{
    var tags = getLikeElements(tagName, attrName, attrValue);
    for (var i = 0; i < tags.length; i++){
	if (tags[i].getAttribute('focus_flag') == 1)
            return tags[i];
    }
    return null;
}

// nodeImageの親のnodeEditにFocusFlagをセット
function setFocusToNodeImage(nodeimage)
{
    var nodeedit = nodeimage.parentNode;
    setFocusToNodeEdit(nodeedit);
}

// spotBlockの親のnodeEditにFocusFlagをセット
function setFocusToSpotBlock(spotblock)
{
    var nodeedit = spotblock.parentNode;
    setFocusToNodeEdit(nodeedit);
}

// nodeEditにFocusFlagをセット
function setFocusToNodeEditOnClick(nodeedit)
{
    if (gl_block_onclick) { 
        gl_block_onclick = 0;
        return false;
    }
    setFocusToNodeEdit(nodeedit);
}

// nodeEditにFocusFlagをセット
function setFocusToNodeEdit(nodeedit)
{
    setFocusToTag(nodeedit, 'div', 'class', 'nodeEdit');
}

// 指定したタグ（エレメント）にフォーカス(FocusFlag)をセットする
function setFocusToTag(tag, tagName, attrName, attrValue)
{
    var style = 'border: 1px solid green; background-color: orange;';
    var tags = getLikeElements(tagName, attrName, attrValue);
    for (var i = 0; i < tags.length; i++){
        if (tags[i] == tag){
            tags[i].setAttribute('focus_flag', '1');
            tags[i].style.cssText = style;
        }else{
            tags[i].setAttribute('focus_flag', '');
            tags[i].style.cssText = '';
        }
    }
}

// Spot関連のボタンの制御
function changeSpotInfoButtons(spotblock, spotid)
{
    // 「経緯度登録を解除」ボタン
    var resetspotinfo  = getElementByClassName(spotblock, 'resetSpotInfo');
    // 「経緯度登録の変更」ボタン
    var searchspotinfo = getElementByClassName(spotblock, 'searchSpotInfo');
    // 「新規に経緯度登録」ボタン
    var registspotinfo = getElementByClassName(spotblock, 'registSpotInfo');
    // スポットの状態
    var span_spotstatus = getElementByClassName(spotblock, 'spotstatus');

    if (spotid){
        if (span_spotstatus)
            span_spotstatus.innerHTML = '◀';
        if (resetspotinfo)
            resetspotinfo.style.display  = '';
        if (searchspotinfo)
            searchspotinfo.style.display = 'none';
        if (registspotinfo)
            registspotinfo.style.display = 'none';
    }else{
        if (span_spotstatus)
            span_spotstatus.innerHTML = '◀';
        if (resetspotinfo)
            resetspotinfo.style.display  = 'none';
        if (searchspotinfo)
            searchspotinfo.style.display = '';
        if (registspotinfo)
            registspotinfo.style.display = '';
    }
}

// 画像リンクをセット
function setImageInfo(url, imageid, postfix, title)
{
    var nodeimage     = opener.getFocusNodeImage();
    var input_imageid = getElementByClassName(nodeimage, 'imageid');
    var image_org_ref = getElementByClassName(nodeimage, 'image_org_ref');
    var image_thum    = getElementByClassName(nodeimage, 'image_thum');

    // セット
    input_imageid.value = imageid;
    image_org_ref.setAttribute('href', url+'/'+imageid+'_vga'+postfix);
    image_thum.setAttribute('src', url+'/'+imageid+'_small'+postfix);
    image_thum.setAttribute('alt', title);
    image_thum.setAttribute('title', title);
    image_thum.style.display = '';
    //
    changeImageInfoButtons(nodeimage, imageid);
}

// 画像検索ウィンドウを生成
function searchImageInfo(nodeimage)
{
    var width  = 650;
    var height = 650;
    // FocusFlagをセット
    setFocusToNodeImage(nodeimage);
    makeSubWindow('/image/search?window_type=sub_window', nodeimage, width, height);
}

// 画像アップロード用子画面に切り替え
function callUpImageSubWindow()
{
    var parent_focus = opener.getFocusSpotBlock();
    registImageInfo( parent_focus );
}

// 画像登録ウィンドウを生成
function registImageInfo(nodeimage)
{
    // FocusFlagをセット
    setFocusToNodeImage(nodeimage);
    makeSubWindow('/image/upimage?window_type=sub_window', nodeimage);
}

// 画像リンクをクリア
function resetImageInfo(nodeimage)
{
    var input_imageid = getElementByClassName(nodeimage, 'imageid');
    var image_org_ref = getElementByClassName(nodeimage, 'image_org_ref');
    var image_thum    = getElementByClassName(nodeimage, 'image_thum');
    input_imageid.value = '';
    image_org_ref.setAttribute('href', '');
    image_thum.setAttribute('src', '');
    image_thum.setAttribute('alt', '');
    image_thum.setAttribute('title', '');
    image_thum.style.display = 'none';
    //
    changeImageInfoButtons(nodeimage);
}

// 
function changeImageInfoButtons(nodeimage, imageid)
{
    var resetimageinfo  = getElementByClassName(nodeimage, 'resetImageInfo');
    var searchimageinfo = getElementByClassName(nodeimage, 'searchImageInfo');
    //    var registimageinfo = getElementByClassName(nodeimage, 'registImageInfo');

    if (imageid){
        resetimageinfo.style.display  = '';
        searchimageinfo.style.display = 'none';
        //        registimageinfo.style.display = 'none';
    }else{
        resetimageinfo.style.display  = 'none';
        searchimageinfo.style.display = '';
        //        registimageinfo.style.display = '';
    }
}

// 該当するクラス名称の要素を取得
function getElementByClassName(elm, classname) 
{
    if (elm.nodeType == 1) {
	var classNames = elm.className.split(' ');
	for (var j = 0; j < classNames.length; j++) {
	    if (classNames[j] == classname) {
		return elm;
	    }
	}
    }
    for (var i=0; i < elm.childNodes.length; i++){
	var ret = getElementByClassName(elm.childNodes.item(i), classname);
	if (ret) return ret;
    } 
    return null;
}

// elm以下の条件にヒットする要素の配列を取得
function getLikeElements(tagName, attrName, attrValue, elm) {
  var tags;
  var rets = new Array();
  if (!elm) { elm = document; }

  if (tagName)
    tags = elm.getElementsByTagName(tagName);
  else
    tags = (elm.all) ? document.all : elm.getElementsByTagName("*");

  if (!attrName) { return tags; }

  for (var i = 0; i < tags.length; i++) {
    if (attrName == 'class') {
      if (tags[i].className.match( new RegExp("(^|\\s)"+attrValue+"(\\s|$)")))
        rets[rets.length] = tags[i];
    }else{
      var avalue = tags[i].getAttribute(attrName);
      if (avalue) {
         if (attrValue) {
           if (avalue == attrValue)
             rets[rets.length] = tags[i];
         }else{
           rets[rets.length] = tags[i];
	 }
      }
    }
  }
  return rets;
}

// targetの子供で、elmと同じclass名の要素数を返す
function getElementNum(target, elm)
{
    var num = 0;
    for (var i=0; i < target.childNodes.length; i++){
	if (target.childNodes.item(i).className == elm.className)
	    num++;
    }
    return num;
}

// ノードを下に挿入
function doinsNode(node, textoff)
{
    if ( document.getElementById && document.createElement ) {
        var newn = node.cloneNode( true );
        if ( textoff ) { textOff( newn ); }
        if ( textoff == 2 ) { remainOneNodeEdit( newn ); }
        valueOff( newn, 'nodeid' );
        var next = getNextNode( node );
        if ( next && next.parentNode == node.parentNode ) {
            node.parentNode.insertBefore( newn, next );
        }else{
            node.parentNode.insertBefore( newn, null );
        }
        setFocusOnTheFirstInput( newn );
    }else{
        alert( 'あなたのブラウザはLevel 1のDOM をサポートしていません。' );
    }
    return newn;
}

// ノードを削除
function dodelNode( node ) {
    if (document.getElementById && document.createElement) {
        var parent = node.parentNode;
        if ( getElementNum(parent, node) > 1 )
            parent.removeChild(node);
        else
            textOff(node);
    }else{
        alert('あなたのブラウザはLevel 1のDOM をサポートしていません。');
    }
}

// ノードをひとつ上に移動
function doupNode(node)
{
    if (document.getElementById && document.createElement) {
        var prev = getPreviousNode(node);
        if (prev) {
            if (prev.parentNode == node.parentNode) {
                prev.parentNode.insertBefore(node, prev);
            }else{
                prev.parentNode.insertBefore(node, null);
            }		
         }
    }else{
        alert('あなたのブラウザはLevel 1のDOM をサポートしていません。');
    }
}

// ノードをひとつ下に移動
function dodownNode(node)
{
    if (document.getElementById && document.createElement) {
        var next = getNextNode(node);
        if (next) {
            if (next.parentNode == node.parentNode) {
                next.parentNode.insertBefore(next, node);
            }else{
                // dayEditを超える場合
                next.parentNode.insertBefore(node, next);		
            }
	    }
    }else{
        alert('あなたのブラウザはLevel 1のDOM をサポートしていません。');
    }
}

// 前のノードを取得する関数
function getPreviousNode(obj)
{
    var nodes = getLikeElements(obj.nodeName, "class", obj.className);
    for (var i = 0; i < nodes.length; i++){
        if (nodes[i] == obj){
            return nodes[i - 1];
        }
    }
    return null;
}

// 次のノードを取得する関数
function getNextNode(obj)
{
    var nodes = getLikeElements(obj.nodeName, "class", obj.className);
    for (var i = 0; i < nodes.length; i++){
        if (nodes[i] == obj){
            return nodes[i + 1];
        }
    }
    return null;
}

// 日付形式をチェックする関数
function checkDate(elm) 
{
    var yr, mo, day;
    var entry = elm.value;
    var today = new Date();
    var delimChar = (entry.indexOf("/") != -1) ? "/" : "-";
    var reDelim = /[\/-]/g;
    var reLong  = /\b\d{4}[\/-]\d{1,2}[\/-]\d{1,2}\b/;
    var reShort = /\b\d{2}[\/-]\d{1,2}[\/-]\d{1,2}\b/;
    var result = entry.match(reDelim);
    if (result.length < 2) {
	entry = today.getFullYear() + delimChar + entry;    
    }
    var valid = (reLong.test(entry) || reShort.test(entry));
    if (valid) {
	var delim1 = entry.indexOf(delimChar);
	var delim2 = entry.lastIndexOf(delimChar);
	var yr  = parseInt(entry.substring(0, delim1), 10);
	var mo  = parseInt(entry.substring(delim1+1, delim2), 10);
	var day = parseInt(entry.substring(delim2+1), 10);
	// 2桁形式の年を処理する
	if (yr < 100) {
	    // 現世紀の最初の年 (例、2000年)
	    var currCent = parseInt(today.getFullYear() / 100) * 100;
	    // 今年から15年後までは現世紀の年として扱う
	    var threshold = (today.getFullYear() + 15) - currCent;
	    if (yr > threshold) {
		yr += currCent - 100;
	    }else{
		yr += currCent;
	    }
	}
	var testDate = new Date(yr, mo-1, day);
	if (testDate.getDate() == day){
	    if (testDate.getMonth() + 1 == mo){
		if (testDate.getFullYear() == yr) {
		    // データベースにふさわしい形式でフィールドを埋める
                    elm.value = to_yyyymmdd(yr, mo, day);
		    return true;
		}else{ 
		    alert("年の値がおかしいです");
		    return false;
		}
	    }else{
		alert("月の値がおかしいです");
		return false;
	    }
	}else{
	    alert("日の値がおかしいです");
	    return false;
	}
    }else{
	alert("年-月-日の形式で入力してください");
	return false;
    }
    return true;
}

// Article作成画面で、Nodeの日付を自動計算する
function autoCompNodeDate(curdoc)
{
    // 
    if ( !curdoc ) { curdoc = document; }
    
    // 日付順を更新
    var dayOrders = getLikeElements("span", "class", "dayOrder", curdoc);
    for (var i = 0; i < dayOrders.length; i++){
	dayOrders[i].innerHTML = (i+1).toString()+'日目';
    }
    // ノード年月日の更新
    var reLong = /\b\d{4}[\/-]\d{1,2}[\/-]\d{1,2}\b/;
    var startdate = curdoc.getElementById("startdate");
    var entry  = startdate.value;
    var delimChar = (entry.indexOf("/") != -1) ? "/" : "-";
    var delim1 = entry.indexOf(delimChar);
    var delim2 = entry.lastIndexOf(delimChar);
    var yr  = parseInt(entry.substring(0, delim1), 10);
    var mo  = parseInt(entry.substring(delim1+1, delim2), 10);
    var day = parseInt(entry.substring(delim2+1), 10);

    // ノード年月日のループ
    var dayEdits = getLikeElements("div", "class", "dayEdit", curdoc);
    for (var i = 0; i < dayEdits.length; i++) {
	var dd = new Date(yr, (mo-1), (day+i));
	var nodeDates = getLikeElements("input", "class", "nodedate",
                                        dayEdits[i]);
	for (var j = 0; j < nodeDates.length; j++){
	    nodeDates[j].value = to_yyyymmdd(dd.getFullYear(),
                                             dd.getMonth() + 1,
                                             dd.getDate());
	}
    }

    // ノードオーダーの調整
    var nodeOrder = getLikeElements("input", "class", "nodeorder", curdoc);
    for (var i = 0; i < nodeOrder.length; i++) {
        nodeOrder[i].value = (i + 1);
    }
}

// yyyy-mm-dd形式にする
function to_yyyymmdd(year, month, day)
{
    var y = (year+"").length == 4 ?
            year :
            ((year > 50) ? '19'+year : '20' + year);
    var m = (month+"").length == 1 ? ('0' + month) : month;
    var d = (day+"").length == 1 ? ('0' + day) : day;
    return y + '-' + m + '-' + d;
}

// Article作成画面で、articleidを空にしたら、routeidも空にする
function adjustRouteId(elm) 
{
    if (elm.value.length == 0){
	document.actionForm.routeid.value = '';
    }
}

// Article作成画面で、タイプの選択により、クラブ選択を有効無効にする
function onChangeType(type)
{
    //    alert(type);
    var clubid            = $('clubid');
    var clubid_label      = $('clubid_label');
    var publevel_personal = $('publevel_personal');
    var publevel_club     = $('publevel_club');
    if (type == 'club') {
        //clubid.style.display = "";
        Effect.Appear(clubid);
	clubid_label.className = "hissu";
        //publevel_personal.style.display = "none";
        //publevel_club.style.display = "";
        Effect.Fade(publevel_personal);
        Effect.Appear(publevel_club);
    }else{
        //	clubid.style.display = "none";
        Effect.Fade(clubid);
	clubid_label.className = "";
        //publevel_personal.style.display = "";
        //publevel_club.style.display = "none";
        Effect.Appear(publevel_personal);
        Effect.Fade(publevel_club);
    }

}

// Articleの入力内容を検証する
function checkArticleForm( form )
{
    if ( !form.title.value ) {
        alert('タイトルが未入力です');
        return false;
    }
    if ( !form.startdate.value ) {
        alert('出発日が未入力です');
        return false;
    }
    if ( !checkDate(form.startdate) ) {
        return false;
    }
    if ( !form.postdate.value ) {
        alert('投稿日が未入力です');
        return false;
    }
    //    if ( !checkDateTime(form.postdate) ) {
    //        return false;
    //    }
    return true;
}

function toggleRouteInfo ()
{
    var routeinfo = $('routeinfo');
    if ( routeinfo.value == 0 ) {
        routeinfo.value = 1;
        onRouteInfo();
    } else {
        routeinfo.value = 0;
        offRouteInfo();
    }
}

function onRouteInfo()
{
    var func = Effect.Appear;
    applyRouteInfo( func );
}

function offRouteInfo()
{
    var func = Effect.Fade;
    applyRouteInfo( func );
}

function applyRouteInfo ( func ) 
{
    var classNameList = ['startDate', 'searchRoute', 'dayEditHead', 'datetimeBlock', 'trekBlock'];

    classNameList.each(
        function( classname ) {
            var classList = document.getElementsByClassName( classname );
            classList.each ( function( elm ) { func( elm ) } );
        }
    );
}

function myTest ( form )
{
    alert('before');
    Effect.Fade( form.send );
    Effect.Fade( form.edit );
    alert('submit');
}
