/*
 * JavaScript の共用部分
 */

/**
 * Event の拡張
 *
 * 指定された要素にイベントを発火させる
 */
Object.extend(Event, {
 dispatchEvent: function(element, event, eventName) {
   var newEvent = new Object();
   for(var prop in event)
     newEvent[prop] = event[prop];
   prop.type = eventName;
   prop.target = element;
   if (element.dispatchEvent) {
     element.dispatchEvent( event );
   } else if (element.fireEvent) {
     element.fireEvent('on' + eventName, event);
   } else {
     throw new Error("element support neither dispatchEvent nor fireEvent method.");
   }
 }
});

/** String オブジェクト拡張 */
String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g, "") }

/**
 * ログ書きだし関数
 */
function logWrite(msg) {
  var logDiv = $('log');
  logDiv.innerHTML = logDiv.innerHTML + "<br>\n" + msg;
}

/**
 * 特定のタグ以外を htmlspecialchars したものを返します。
 */
function stripTags(text) {
  // まず、エスケープをして、
  text = text.replace(/&/g, '&amp;');
  text = text.replace(/</g, '&lt;');
  text = text.replace(/>/g, '&gt;');
  // 特定のタグをもとにもどす
  var unstripTags = ["b", "i", "sup", "sub"];
  for (var i = 0; i < unstripTags.length; i++) {
    text = unstripTag(text, unstripTags[i]);
  }
  return text;
}

/**
 * エスケープされた HTML 文字列のうち、指定されたタグをもとに戻して返
 * します。
 */
function unstripTag(str, tag) {
  var reStart = new RegExp('&lt;' + tag + '&gt;', 'g');
  var reEnd = new RegExp('&lt;/' + tag + '&gt;', 'g');

  str = str.replace(reStart, "<" + tag + ">");
  str = str.replace(reEnd, "</" + tag + ">");
  return str;
}

/**
 * single quote, double quote を backslash でエスケープします
 */
function escapeQuote(str) {
  var reSQuo = new RegExp("'", 'g');
  var reDQuo = new RegExp('"', 'g');
  str = str.replace(reSQuo, "\\'");
  str = str.replace(reDQuo, '\"');
  return str;
}


/**
 * 配列が同じかどうか調べる
 */
function isArraySame(a1, a2) {
  if (a1.length != a2.length) {
    return false;
  }
  for (var i = 0; i < a1.length; i++) {
    if (a1[i] != a2[i]) {
      return false;
    }
  }
  return true;
}
