if (typeof com == "undefined") var com = {};
if (typeof com.doctorstal == "undefined") com.doctorstal = {};
if (typeof com.doctorstal.lcheck == "undefined") com.doctorstal.lcheck = {};

com.doctorstal.lcheck.AddressEvent=function(type){
	this.type=type;
	this.hash=Checker.getAddr();
}
AddressEvent=com.doctorstal.lcheck.AddressEvent;

com.doctorstal.lcheck.Checker=new function(){
	var UNDEFINED="undefined";

	var CHANGE="addr_change";
	this.CHANGE=CHANGE;
	
	var _listeners=new Array();
	var _dispatchEvent=function(event){
		 if (typeof _listeners[event.type] != UNDEFINED && _listeners[event.type].length) {
            event.target = this;
            for (var i = 0, l; l = _listeners[event.type][i]; i++)
                l(event);
            return true;           
        }
        return false;
	}
	var _addEventListener = function(type, listener) {
        if (typeof _listeners[type] == UNDEFINED)
            _listeners[type] = [];
        _listeners[type].push(listener);
	}
	this.addEventListener = _addEventListener;
	
	this.removeEventListener = function(type, listener) {
        if (typeof _listeners[type] != UNDEFINED) {
            for (var i = 0, l; l = _listeners[type][i]; i++)
                if (l == listener) break;
            _listeners[type].splice(i, 1);
        }
    }
	this.setHash=function(_hash){
		top.location.hash=_hash;
	}
	var _getHash=function(){
		return unescape(top.location.hash);
	}
	this.getHash=_getHash;
	var _curraddr=_getHash();
	var _checkHash=function(){
		var newaddr=_getHash();
		if(newaddr!=_curraddr){
			_curraddr=newaddr;
			_dispatchEvent(new AddressEvent(CHANGE));
		}
	}
	this.getAddr=function(){
		return _curraddr;
	}
	setInterval(_checkHash,5);
}
Checker=com.doctorstal.lcheck.Checker;

com.doctorstal.lcheck.SWFListenerCollection=new function(){
	_items=[];
	this.addItem=function(item){
		var nname="item"+_items.length
		_items[nname]=item;
		return nname;
	}
}
SWFListenerCollection=com.doctorstal.lcheck.SWFListenerCollection;

com.doctorstal.lcheck.SWFListener=function(swfurl){
	swfurl=unescape(swfurl);
	swfurl=String(swfurl).replace(/\\/g,"/");
	var SWF_METHOD_NAME="onHashChanged";
	this._listener={};
	this.changed=function(event){
		if(typeof this._listener[SWF_METHOD_NAME]=="function"){
			this._listener[SWF_METHOD_NAME](event.hash);
		}
	}
	var addr=(/([a-z]*\:\/+)([^\/]*)(([^?#]*\/)(.*))/).exec(swfurl)[5];
	var embeds=document.getElementsByTagName("embed");
	if(embeds.length>0){
		for(var i=0;i<embeds.length;i++){
			
			if(new RegExp(addr).test(embeds[i].attributes["src"].value)){
				this._listener=embeds[i];
				Checker.addEventListener(Checker.CHANGE,this.changed);
			}
		}
	}else{
		var objects=document.getElementsByTagName("object");
		for(var i=0;i<objects.length;i++){
			var parr=objects[i].getElementsByTagName("param");
			var src_="";
			for(var j=0;j<parr.length;j++){
				if(parr[j].name=="movie"){
					src_=parr[j].value;
					break;
				}
			}
			if(new RegExp(addr).test(src_)){
				this._listener=objects[i];
				Checker.addEventListener(Checker.CHANGE,this.changed);
			}
		}
	}
	
	return SWFListenerCollection.addItem(this);
}
SWFListener=com.doctorstal.lcheck.SWFListener;

com.doctorstal.lcheck.FCall=function(name,method,args){
	return com.doctorstal.lcheck[name][method](args);
}
FCall=com.doctorstal.lcheck.FCall;