// spica javascript libraries - spica.js -- version 0.05
// == written by Takuya Otani <takuya.otani@gmail.com> ===
// == Copyright (C) 2006 SimpleBoxes/SerendipityNZ Ltd. ==
// === array ===
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;
 this.hasNS = (document.documentElement) ? document.documentElement.namespaceURI : null;
 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() });

