if (!Array.prototype.pop)
{
  Array.prototype.pop = function()
  {
    if (!this.length) return null;
    var last = this[this.length - 1];
    --this.length;
    return last;
  }
}
if (!Array.prototype.push)
{
  Array.prototype.push = function()
  {
    for (var i=0,n=arguments.length;i<n;i++)
      this[this.length] = arguments[i];
    return this.length;
  }
}
if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(value,idx)
  {
    if (typeof(idx) != 'number') idx = 0;
    else if (idx < 0) idx = this.length + idx;
    for (var i=idx,n=this.length;i<n;i++)
      if (this[i] === value) return i;
    return -1;
  }
}

// === browser ===
function Browser()
{
  this.name = navigator.userAgent;
  this.isWinIE = this.isMacIE = false;
  this.isGecko  = this.name.match(/Gecko\//);
  this.isSafari = this.name.match(/AppleWebKit/);
  this.isKHTML  = this.isSafari || navigator.appVersion.match(/Konqueror|KHTML/);
  this.isOpera  = window.opera;
  if (document.all && !this.isGecko && !this.isSafari && !this.isOpera)
  {
    this.isWinIE = this.name.match(/Win/);
    this.isMacIE = this.name.match(/Mac/);
  }
}
var Browser = new Browser();
// === event ===
if (!window.Event) var Event = new Object;
Event = {
  cache : false,
  getEvent : function(evnt)
  {
    return (evnt) ? evnt : ((window.event) ? window.event : null);
  },
  getKey : function(evnt)
  {
    evnt = this.getEvent(evnt);
    return (evnt.which) ? evnt.which : evnt.keyCode;
  },
  stop : function(evnt)
  {
    try{ evnt.stopPropagation() } catch(err){};
    evnt.cancelBubble = true;
    try{ evnt.preventDefault() } catch(err){};
    return (evnt.returnValue = false);
  },
  register : function(object, type, handler)
  {
    if (type == 'keypress' && (Browser.isKHTML || object.attachEvent)) type = 'keydown';
    if (type == 'mousewheel' && Browser.isGecko) type = 'DOMMouseScroll';
    if (!this.cache) this.cache = [];
    if (object.addEventListener)
    {
      this.cache.push([object,type,handler]);
      object.addEventListener(type, handler, false);
    }
    else if (object.attachEvent)
    {
      this.cache.push([object,type,handler]);
      object.attachEvent(['on',type].join(''),handler);
    }
    else
    {
      object[['on',type].join('')] = handler;
    }
  },
  deregister : function(object, type, handler)
  {
    if (type == 'keypress' && (Browser.isKHTML || object.attachEvent)) type = 'keydown';
    if (type == 'mousewheel' && Browser.isGecko) type = 'DOMMouseScroll';
    if (object.removeEventListener)
      object.removeEventListener(type, handler, false);
    else if (object.detachEvent)
      object.detachEvent(['on',type].join(''), handler);
    else
      object[['on',type].join('')] = null;
  },
  deregisterAll : function()
  {
    if (!Event.cache) return
    for (var i=0,n=Event.cache.length;i<n;i++)
    {
      Event.deregister(Event.cache[i]);
      Event.cache[i][0] = null;
    }
    Event.cache = false;
  }
};
Event.register(window, 'unload', Event.deregisterAll);
// === dom ===
document.getElemetsByClassName = function(name,target)
{
  var result = [];
  var object  = null;
  var search = new RegExp(['(^|\\s)',name,'(\\s|$)'].join(''));
  if (target && target.getElementsByTagName)
    object = target.getElementsByTagName('*');
  if (!object)
    object = document.getElementsByTagName ? document.getElementsByTagName('*') : document.all;
  for (var i=0,n=object.length;i<n;i++)
  {
    var check = object[i].getAttribute('class') || object[i].className;
    if (check.match(search)) result.push(object[i]);
  }
  return result;
}
// === library ===
function Library()
{
  this._path = '';
  this._cache = [];
  this.lang = '';
  this.base = '';
  return this._init();
}
Library.prototype = {
  _init : function()
  {
    var rs_path = document.getElementsByName('X-Resource-Dir')[0];
    var js_path = document.getElementsByName('X-Script-Dir')[0];
    if (rs_path)
    {
      this.base = this._check_path(rs_path.getAttribute('content'));
      if (!js_path) this._path = [this.base,'js/'].join('');
    }
    if (js_path)
      this._path = this._check_path(js_path.getAttribute('content'));
    return this;
  },
  _initLang : function()
  {
    var html = document.getElementsByTagName('html')[0];
    if (!html) return;
    this.lang = html.getAttribute('xml:lang') || html.getAttribute('lang');
  },
  _check_path : function(path)
  {
    if (!path) return '';
    if (!path.match(/\/$/)) path = [path,'/'].join('');
    return path;
  },
  require : function(libs)
  {
    var pre  = '\n<script type="text/javascript" src="';
    var post = '.js"></script>';
    for (var i=0,n=libs.length;i<n;i++)
    {
      if (this._cache.indexOf(libs[i]) > -1) continue;
      document.write([pre,this._path,libs[i],post].join(''));
      this._cache.push(libs[i]);
    }
  },
  path : function(path)
  {
    this._path = this._check_path(path);
  }
}
var Library = new Library();
Event.register(window,'load',function() { Library._initLang() });


// === Flash ===
function flash_movie(src, ids, width, height, wmode)
{
  var wh = "";
  if (parseInt(width) && parseInt(height)) 
    wh = " width='"+width+"' height='"+height+"' ";
  return "<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0' "+wh+" id="+ids+"><param name=wmode value="+wmode+"><param name=movie value="+src+"><param name=quality value=high><embed src="+src+" quality=high wmode="+wmode+" type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?p1_prod_version=shockwaveflash' "+wh+"></embed></object>";
}

function obj_movie(src, ids, width, height, autostart)
{
  var wh = "";
  if (parseInt(width) && parseInt(height)) 
    wh = " width='"+width+"' height='"+height+"' ";
  if (!autostart) autostart = false;
  return "<embed src='"+src+"' "+wh+" autostart='"+autostart+"'></embed>";
}

function doc_write(cont)
{
  document.write(cont);
}

