////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// global variables
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
var sec_timeout_default = 10, sec_timeout = new Array();
var httpObj = new Array(), timerID = new Array();
var g_count_request = 0;

var g_dirName = new Array();
g_dirName['cgi'] = 'cgi-bin';
g_dirName['img'] = 'img';
g_dirName['xml'] = 'xml';
g_dirName['usr'] = '_usr';
g_dirName['opn'] = '_opn';
g_dirName['shr'] = '_shr';



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// HTTPリクエストを送信し，XMLを受け取る
//
//  課題： “パイプライン”化
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function httpXMLRequest(url, method, data, func_success, func_error, requestID, sync) {
  g_count_request++;
  requestID += ( '_' + (new Date()).getTime() + '_' + g_count_request);
  try {
    // for DOM
    if( window.XMLHttpRequest ) { httpObj[requestID] = new XMLHttpRequest(); }
    // for IE6
    else if( window.ActiveXObject ) { httpObj[requestID] = new ActiveXObject("Microsoft.XMLHTTP"); }
    // Others
    else { httpObj[requestID] = false; }
  }
  catch(e) { httpObj[requestID] = false; }

  if( !httpObj[requestID] ) {
    alert( 'Sorry. Please use other browser.' );
    return false;
  }

  sec_timeout[requestID] = sec_timeout_default;
  timerID[requestID] = setInterval('checkTimeout(\'' + requestID + '\')', 1000);

  url += ('?' + (new Date()).getTime() + '&'); // キャッシュ防止
  httpObj[requestID].open(method, url, sync);
  if( method == 'POST' ) { httpObj[requestID].setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); } // POST の場合，HTTPリクエストヘッダを指定
  httpObj[requestID].onreadystatechange = function() {
    if( httpObj[requestID].readyState == 4 ) {
      clearInterval(timerID[requestID]);
      if( httpObj[requestID].status == 200 ) {
        func_success(httpObj[requestID].responseXML);
      }
      else if( httpObj[requestID].status == 404 ) { // Not Found
        func_error(httpObj[requestID].status + ': XML not found.');
      }
      /*
      else if( httpObj[requestID].status == 304 ) { // Not Modified
        true;
      }
      */
      else {
        func_error(httpObj[requestID].status + ': ' + httpObj[requestID].statusText);
        return false;
      }
    }
  }
  httpObj[requestID].send(data);
  return true;
}

function checkTimeout(requestID) {
  if( --sec_timeout[requestID] <= 0 ) {
    clearInterval(timerID[requestID]);
    httpObj[requestID].abort();
    alert('request timeout.');
    return false;
  }
  return;
}


function httpError(msg) {
  alert(msg);
  return;
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// イベントリスナーをセット
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function addListener(elm, eType, func, cap) {
  // for DOM
  if( elm.addEventListener ) {
    elm.addEventListener(eType, func, cap);
    return true;
  }
  // for IE6
  else if( elm.attachEvent ) {
    elm.attachEvent('on' + eType, func);
    return true;
  }
  else {
    alert('Not supported.');
    return false;
  }
  return false;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// イベントリスナーを解除
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function removeListener(elm, eType, func, cap) {
  // for DOM
  if( elm.removeEventListener ) {
    elm.removeEventListener(eType, func, cap);
    return true;
  }
  // for IE6
  else if( elm.detachEvent ) {
    elm.detachEvent('on' + eType, func);
    return true;
  }
  else {
    alert('Not supported.');
    return false;
  }
  return false;
}





////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// 以下の形式の文字列を年月日に変換
//
//     yyyymmdd -> yyyy年mm月dd日
//     yyyymm   -> yyyy年mm月
//     yyyy     -> yyyy年
//     mmdd     -> mm月dd日
//     dd       -> dd日
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function str2Date(str_ymd) {
  var date = '';
  // yyyymmdd
  if( str_ymd.length == 8 ) {
    var yyyy = str_ymd.substring(0, 4);
    var mm   = str_ymd.substring(4, 6);
    var dd   = str_ymd.substring(6, 8);
    date += (yyyy + '年');
    //if( parseInt(mm) < 10 ) { date += ' '; } // Firefox と IE でうまくいかん．．．
    //date += ( parseInt(mm) + '月' );
    if( mm.substring(0, 1) == '0' ) { date += ' ' + mm.substring(1, 2) + '月'; }
    else { date += mm + '月'; }
    //if( parseInt(dd) < 10 ) { date += ' '; } // Firefox と IE でうまくいかん．．．
    //date += ( parseInt(dd) + '日' );
    if( dd.substring(0, 1) == '0' ) { date += ' ' + dd.substring(1, 2) + '日'; }
    else { date += dd + '日'; }
    return date;
  }
  // yyyymm
  else if( str_ymd.length == 6 ) {
    var yyyy = str_ymd.substring(0, 4);
    var mm   = str_ymd.substring(4, 6);
    date += (yyyy + '年');
    //if( parseInt(mm) < 10 ) { date += ' '; }
    //date += ( parseInt(mm) + '月' );
    if( mm.substring(0, 1) == '0' ) { date += ' ' + mm.substring(1, 2) + '月'; }
    else { date += mm + '月'; }
    return date;
  }
  // dd
  else if( str_ymd.length == 2 ) {
    var dd = str_ymd;
    //if( parseInt(dd) < 10 ) { date += ' '; }
    //date += ( parseInt(dd) + '日' );
    if( dd.substring(0, 1) == '0' ) { date += ' ' + dd.substring(1, 2) + '日'; }
    else { date += dd + '日'; }
    return date;
  }
  // yyyy or mmdd
  else {
    // 1231 より大ならば，確実に西暦を表している
    if( parseInt(str_ymd) > 1231 ) {
      var yyyy = parseInt(str_ymd);
      date += (yyyy + '年');
    }
    // それ以外ならば月日だろう
    else {
      var mm = str_ymd.substring(0, 2);
      var dd = str_ymd.substring(2, 4);
      //if( parseInt(mm) < 10 ) { date += ' '; } // Firefox と IE でうまくいかん．．．
      //date += ( parseInt(mm) + '月' );
      if( mm.substring(0, 1) == '0' ) { date += ' ' + mm.substring(1, 2) + '月'; }
      else { date += mm + '月'; }
      //if( parseInt(dd) < 10 ) { date += ' '; } // Firefox と IE でうまくいかん．．．
      //date += ( parseInt(dd) + '日' );
      if( dd.substring(0, 1) == '0' ) { date += ' ' + dd.substring(1, 2) + '日'; }
      else { date += dd + '日'; }
    }
    return date;
  }
  return date;
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// 要素の位置オブジェクトを取得
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function getPosition(element) {
  var obj = new Object();
  obj.x = element.offsetLeft;
  obj.y = element.offsetTop;
  while( element.offsetParent ) {
    element = element.offsetParent;
    obj.x += element.offsetLeft;
    obj.y += element.offsetTop;
  }
  return obj;
}




////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// 配列 （要素は key=val 形式） をクエリ文字列として返す
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function array2queryString(array) {
  var str = '';
  var i;
  for( i = 0; i < array.length; i++ ) {
    var keyval = array[i].split('=');
    array[i] = keyval[0] + '=' + encodeURIComponent(keyval[1]);
  }
  return array.join('&');
}


//
// size
//
function size2string(size) {
  if( size > 1024 * 1024 ) { size /= (1024 * 1024);  size = Math.round(size * 10) / 10;  return size + ' MB'; }
  else if( size > 1024 )   { size /= 1024;  size = Math.round(size * 10) / 10;  return size + ' KB'; }
  else { return size + ' bytes'; }
  return '';
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// イベントバブリングとデフォルトイベントアクションの停止
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function stopDefaultAndPropagation(e) {
  // イベントバブリングの停止
  if( e.stopPropagation ) { e.stopPropagation(); }
  if( window.event ) { window.event.cancelBubble = true; }
  // デフォルトイベントアクションの停止
  if( e.preventDefault ) { e.preventDefault(); }
  if( window.event ) { window.event.returnValue = false; }
}





////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// ターゲット要素を取得
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function getTargetElement(ev) {
  if( ev.target ) { return ev.target; }
  else { return ev.srcElement; }
}





////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// XMLツリー xml で，タグ tagName が定義されているかをチェックする
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function definedXMLTagName(xml, tagName) {
  if( xml.getElementsByTagName(tagName).length > 0 ) {
    return true;
  }
  else {
    return false;
  }
  return false;
}


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// XML や HTML のツリー構造内 tagName の名を持つノードを得る
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function getNode(dom, tagName, index) {
  if( index == -1 ) { return dom.getElementsByTagName(tagName); } // index == -1 なら，ノードの配列ごと返す
  else { return dom.getElementsByTagName(tagName)[index]; }
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// XML や HTML のツリー構造内 tagName の名を持つノードの値を得る
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function getNodeValue(dom, tagName, index) {
  return dom.getElementsByTagName(tagName)[index].firstChild.nodeValue;
}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// ディレクトリ名を得る
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function dir(type, depth) {
  var parent = './';
  var i; for( i = 0; i < depth; i++ ) { parent += '../'; }
  return parent + g_dirName[type] + '/';
}






////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// タグつきテキストをテキストエリア用テキストに変換する
//   
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function tag2textarea(tagText) {
  var ret = tagText;
  ret = ret.replace(/<\/p\>\<p\>/g, '\n\n');  // 段落の変わり目 "</p><p>" を空行に変換
  ret = ret.replace(/<br \/>/g, '\n'); // "<br />" を改行に変換
  ret = ret.substring(3, ret.length - 4); // 頭部の "<p>" と尾部の "</p>" をそれぞれ除去

  return ret;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// テキストをクエリ値用に変換する（& とか = とかを含む場合の対策）
//   
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function text2queryValue(text) {
  var ret = text;
  ret = ret.replace(/\=/g, '%eql;'); //
  ret = ret.replace(/\&/g, '%amp;'); //
  ret = ret.replace(/\x0d\x0a|\x0a/g, '<br />');
  return ret;
}


