function CSeqAsyncProc( oParent, fnProc ){
	this.oParent = oParent;
	this.fnProc = fnProc;
	this.fCommited = false;
}

CSeqAsyncProc.prototype.exec = function CSeqAsyncProc_exec(){ this.fnProc(); };

CSeqAsyncProc.prototype.commit = function CSeqAsyncProc_commit(){
	this.fCommited = true;
	this.oParent.exec();
};

function CSeqAsyncProcSet(){ this.afnProcs = []; }

CSeqAsyncProcSet.prototype.add = function CSeqAsyncProcSet_add( oProc ){
	oProc.oParent = this;
	this.afnProcs[ this.afnProcs.length ] = oProc;
};

CSeqAsyncProcSet.prototype.exec = function CSeqAsyncProcSet_exec(){
	for( var i = 0; !this.afnProcs[ i ].fCommited && i < this.afnProcs.length; i++ );
	if( i < this.afnProcs.length )
		this.afnProcs[ i ].exec();
};

function CMiniDiv( sId ){
	this.aoRequiredRes = [];
	this.id = sId;
	CMiniDiv.aoMiniDivs[ CMiniDiv.aoMiniDivs.length ] = this;
}

CMiniDiv.prototype.setRequiredRes = function CMiniDiv_setRequiredRes( sBaseDir, sResFile, sLang ){
	this.aoRequiredRes[ this.aoRequiredRes.length ] = CCommonRes.get( sBaseDir, sResFile, sLang );
};

CMiniDiv.prototype.create = function CMiniDiv_create(){
	var i;

	for( i = 0; i < this.aoRequiredRes.length && this.aoRequiredRes[ i ].hasLoaded(); i++ );

	if( i < this.aoRequiredRes.length ){
		this.aoRequiredRes[ i ].oMiniDiv = this;
		this.aoRequiredRes[ i ].onLoad = function(){ this.oMiniDiv.create(); this.oMiniDiv = void 0; };
		this.aoRequiredRes[ i ].load();
		return;
	}

	if( !this.oDiv ){
		this.oDiv = document.createElement( 'DIV' );
		this.oDiv.id = this.id;
		this.oDiv.oMiniDiv = this;
		this.oDiv.style.display = 'block';
		this.oDiv.style.position = 'absolute';
		this.oDiv.style.zIndex = ( !SP.oBrowserInfo.isIE() )? 'auto': 100;

		document.body.appendChild( this.oDiv );

		if( this.createContents )
			this.createContents();
	}

	if( this.onCreate )
		this.onCreate();
};

CMiniDiv.prototype.onResize = function CMiniDiv_onResize(){
	if( this.getLeft )
		this.oDiv.style.left = this.getLeft() + 'px';
	if( this.getTop )
		this.oDiv.style.top = this.getTop() + 'px';
	if( this.getWidth )
		this.oDiv.style.width = this.getWidth() + 'px';
	if( this.getHeight )
		this.oDiv.style.height = this.getHeight() + 'px';
};

CMiniDiv.createDivs = function CMiniDiv_createDivs( aoMiniDivs ){
	var i;

	for( i = 0; i < aoMiniDivs.length && aoMiniDivs[ i ].oDiv; i++ );

	if( i < aoMiniDivs.length ){
		aoMiniDivs[ i ].oParent = aoMiniDivs;
		aoMiniDivs[ i ].onCreate = function(){ CMiniDiv.createDivs( this.oParent ); this.oParent = void 0; };
		aoMiniDivs[ i ].create();
	}

	for( i = 0; i < aoMiniDivs.length; i++ )
		aoMiniDivs[ i ].onResize();
};

CMiniDiv.switchTo = function CMiniDiv_switchTo( aoMiniDivs ){
	for( var i = 0; i < CMiniDiv.aoMiniDivs.length; i++ ){
		if( CMiniDiv.aoMiniDivs[ i ].oDiv )
			CMiniDiv.aoMiniDivs[ i ].oDiv.style.visibility = 'hidden';
	}
	for( var i = 0; i < aoMiniDivs.length; i++ ){
		if( aoMiniDivs[ i ].oDiv )
			aoMiniDivs[ i ].oDiv.style.visibility = 'visible';
	}
};

CMiniDiv.aoMiniDivs = [];

function CHilitControler(){ this.oPaths = {}; this.oImages = {}; }

CHilitControler.prototype.preload = function CHilitControler_preload( sName, sImgPath, nWidth, nHeight ){
	this.oPaths[ sName ] = [ ( document.images[ sName ] )? document.images[ sName ].src: sImgPath, sImgPath ];
	this.oImages[ sName ] = new Image( nWidth, nHeight );
	this.oImages[ sName ].src = sImgPath;
};

CHilitControler.prototype.doHilit = function CHilitControler_doHilit( oElem, fHilit ){
	var oPath = this.oPaths[ ( oElem.name )? oElem.name: oElem.id ];
	oElem.src = ( oPath )? oPath[ fHilit - 0 ]: oElem.src;
};

CHilitControler.prototype.onHilitEvent = function CHilitControler_onHilitEvent( oEvent ){
	var oEvent = ( SP.oBrowserInfo.isGecko() )? oEvent: window.event;
	var oElem = ( SP.oBrowserInfo.isGecko() )? oEvent.target: oEvent.srcElement;

	if( this.getElemToHilit )
		oElem = this.getElemToHilit( oElem );

	this.doHilit( oElem, oEvent.type == 'mouseover' || oEvent.type == 'mouseup' );

	if( SP.oBrowserInfo.isGecko() ){
		oEvent.stopPropagation();
		oEvent.preventDefault();
	}

	oEvent.cancelBubble = true;
};

function CImgCounter( nInit ){
	this.nCounter = nInit;
	this.oPaths = {};
	this.oImages = {};
}

CImgCounter.prototype.preload = CHilitControler.prototype.preload;

CImgCounter.prototype.appendElements = function CImgCounter_appendElements( oElem ){
	var nFrac = this.nCounter;

	do {
		var nRemainder = nFrac % 10;
		nFrac = Math.floor( nFrac / 10 );
		oElem.insertBefore( this.oImages[ 'Img' + nRemainder ].cloneNode( false ), oElem.firstChild );
	}while( nFrac > 0 );

	return oElem;
};

function CCommonXml(){}

CCommonXml.prototype.load = function CCommonXml_load( sUrl ){
	var fSuccess = true;
	var oXml, oElem;

	if( SP.oBrowserInfo.hasXMLHttp() ){
		oXml = new XMLHttpRequest;
	}else{
		if( !( SP.oBrowserInfo.isSafari() || ( SP.oBrowserInfo.isIE() && SP.oBrowserInfo.compareVer( '5.5' ) < 0 ) ) ){
			oXml = document.createElement( 'XML' );
			if( typeof( oXml.load ) == 'undefined' )
				oXml = void 0;
		}

		if( oXml ){
			oXml.async = false;
			document.body.appendChild( oXml );
		}
	}

	if( !oXml ){
		window.oCommonXml = this;
		var oDiv = document.createElement( 'DIV' );
		oDiv.style.position = 'absolute';
		oDiv.style.visibility = 'hidden';
		oDiv.innerHTML = '<iframe src="http://streetphoto.jp/xmlproxy.php?src=' + sUrl + '"></iframe>';
		document.body.appendChild( oDiv );
		return;
	}

	try {
		if( SP.oBrowserInfo.hasXMLHttp() ){
			oXml.open( 'GET', sUrl, false );
			oXml.send( null );
			oElem = oXml.responseXML.documentElement;
		}else{
			fSuccess = oXml.load( sUrl );
			oElem = oXml.documentElement;
		}
	}catch( e ){
		alert( goStrings[ gsLangPref ].sGeneralError + ' ' + e.message );
		fSuccess = false;
	}

	if( !fSuccess )
		return;

	this.createData( oElem );
};

CCommonXml.prototype.parseChild = function CCommonXml_parseChild( oElem, oData ){
	var sNodeName = oElem.nodeName;
	var vData = this.parse( oElem );

	if( !vData )
		return;

	if( !oData[ sNodeName ] ){
		oData[ sNodeName ] = vData;
	}else{
		if( typeof( oData[ sNodeName ] ) != 'object' || !oData[ sNodeName ].length )
			oData[ sNodeName ] = [ oData[ sNodeName ] ];
		oData[ sNodeName ][ oData[ sNodeName ].length ] = vData;
	}

	return oData;
};

CCommonXml.prototype.parse = function CCommonXml_parse( oElem ){
	if( oElem.nodeValue || !oElem.childNodes.length ){
		var sNodeValue = ( oElem.nodeValue )? oElem.nodeValue.replace( /\n/g, '' ): void 0;
		return ( sNodeValue )? sNodeValue: void 0;
	}

	var oData = {};

	for( var i = 0; i < oElem.childNodes.length; i++ )
		this.parseChild( oElem.childNodes[ i ], oData );

	for( var i = 0; oElem.attributes && i < oElem.attributes.length; i++ )
		this.parseChild( oElem.attributes[ i ], oData );

	return oData;
};

CCommonXml.prototype.createData = function CCommonXml_createData( oElem ){
	this.oData = ( !SP.oBrowserInfo.needXMLProxy() )? this.parse( oElem ): oElem;
	if( this.onLoad )
		this.onLoad();
};

function CCommonRes( sUrl ){
	this.sUrl = sUrl;
	CCommonRes.oRes[ this.sUrl ] = this;
}

CCommonRes.prototype.hasLoaded = function CCommonRes_hasLoaded(){ return !!this.oData; };

CCommonRes.prototype.load = function CCommonRes_load(){
	this.oXml = new CCommonXml;
	this.oXml.oCommonRes = this;
	this.oXml.sTopElement = 'resourcedata';
	this.oXml.onLoad = function(){ this.oCommonRes.createData(); this.oCommonRes = void 0; };
	this.oXml.load( this.sUrl );
};

CCommonRes.prototype.createData = function CCommonRes_createData(){
	if( SP.oBrowserInfo.needXMLProxy() ){
		var oRes = this.oXml.oData.resourcedata.resource;
	}else{
		var oRes = this.oXml.oData.resource;
	}

	var oData = {};

	if( typeof( oRes.length ) == 'undefined' ){
		oData[ oRes.id ] = ( oRes[ '#cdata-section' ] )? oRes[ '#cdata-section' ]: oRes[ '#text' ];
	}else{
		for( var i = 0; i < oRes.length; i++ ){
			var sValue = ( oRes[ i ][ '#cdata-section' ] )? oRes[ i ][ '#cdata-section' ]: oRes[ i ][ '#text' ];
			oData[ oRes[ i ].id ] = ( SP.oBrowserInfo.needXMLProxy() )? SP.shared.unescape( sValue ): sValue;
		}
	}

	this.oData = oData;

	if( this.onLoad )
		this.onLoad();
};

CCommonRes.get = function CCommonRes_get( sBaseDir, sResFile, sLang ){
	sLang = ( !sLang )? SP.oBrowserInfo.getLangPref(): sLang;
	sBaseDir += ( ( sLang != '*' )? ( '/res/' + sLang ): '' );

	var sUrl = sBaseDir + '/' + sResFile;

	if( CCommonRes.oRes[ sUrl ] )
		return CCommonRes.oRes[ sUrl ];

	return new CCommonRes( sUrl );
};

CCommonRes.oRes = [];

