/********************************************************************************
 * @projectDescription Macromedia Flash player - TSharedObject
 * 
 * @author riho.kim@itovi.com, tizie80@nate.com
 * @messanger (msn)kim2000version@hotmail.com, (nate)tizie80@nate.com
 * @site rhio.tistory.com or blog.ecmas4.com
 * @version 1.0.1
 * @usage var StateProvider = new TStateProvider( "site.com" );
 * 
 * @sdoc 
 * @namespace TStateProvider
 * @usage
 * 		TStateProvier.create();
 * 		TStateProvider.setup("com.itovi", "/", 7, null);
 * 
 * @import %designHost%/StateProvider.swf
 * @import Prototype.js 1.6.0.1
 ***********************************************************************************/

var TStateProvider = (function(){
	var Provider = null;
	var isIE = !!(window.attachEvent && !window.opera);
	var isSet = false;
	var __tid__;
	var __tid2__;
	var tag = [];
	var initConfig = {
		codeBase: "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0",
		classid: "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000",
		swf: "/js/StateProvider.swf",
		domain: "*"
	};
	
	function createGlobalStorageWapper() {
		var oDiv = document.createElement('div');
			oDiv.setAttribute("id", "_globalStorageWapper");
			oDiv.setAttribute("version", "1.0.1");
			oDiv.setAttribute("name", "StateProvider");
		
		document.body.appendChild(oDiv);
		return oDiv;
	}
	
	function render() {
		var target = createGlobalStorageWapper();
		
		switch(isIE) {
			case true :
					tag.push('<div style="position:absolute; top:-10px;"><object id="globalStorage__" codebase="'+ initConfig.codeBase +'" width="0" height="0" align="middle" classid="'+ initConfig.classid +'" >');
					tag.push('<param name="movie" value="'+ initConfig.swf +'" />');
					tag.push('<param name="play" value="true" />');
					tag.push('<param name="scale" value="showall" />');
					tag.push('<param name="wmode" value="window" />');
					tag.push('<param name="allowScriptAccess" value="always" />');
					tag.push('<param name="salign" value="" />');
					tag.push('<param name="FlashVars" value="name=TStateProvider&amp;so=com.itovi.viewList" />');
					tag.push('</object></div>');
			break;
			default:
					tag.push('<embed id="globalStorage__" name="globalStorage__" flashVars="name=TStateProvider&amp;so=com.itovi.viewList" width="0" height="0" src="'+ initConfig.swf +'" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" align="middle" play="true" loop="true" scale="showall" wmode="window" devicefont="false" bgcolor="#000000" menu="true" allowFullScreen="true" allowScriptAccess="always" salign="" type="application/x-shockwave-flash" > </embed>');
			break;
		}
		target.innerHTML = tag.join('');
	}
	
	return {
		create: function() {
			if(Provider) return true;
			
			render();

			Provider = (isIE) ? window['globalStorage__'] : document['globalStorage__'];
			Element.extend(Provider);
		},
		
		init: function() {
			isSet = true;
		},
		
		/* public */
		setup: function(domain, expires, path, secure){
			if(!isSet) {
				var self = this;
				__tid__ = window.setTimeout(function(){
					self.setup.apply(self, [domain, expires, path, secure]);
				}, 100);
				return;
			}
			
			window.clearTimeout(__tid__);
			
			Provider.setup(domain, expires, path, secure);
		},
		
		/** public 
		 * SharedObject.data[key] = value; use in Action script
		 * @param {String} key 
		 * @param {String} value
		 * @param {String} Shared-Object filename
		 */
		setItem : function(key, value) {
			if(!isSet) {
				var self = this;
				__tid2__ = window.setTimeout(function() {
					self.setItem.apply(self, [key, value]);
				}, 100);
				return;
			}
			
			Provider.setItem(key, value);
			Provider.fire("TStateProvider:set", { "value" : value});
		},
		
		/** public 
		 * 
		 * @param {String} key
		 * @param {String} Shared-Object filename
		 */
		getItem : function(key) {
			if(!isSet) {
				var self = this;
				__tid2__ = window.setTimeout(function() {
					self.getItem.apply(self, [key]);
				}, 100);
				return;
			}
			
			var value = Provider.getItem(key);
			Provider.fire("TStateProvider:get", {"value" : value});
		},
		
		/** public
		 * 
		 * @param {String} key
		 * @param {String} Shared-Object filename
		 */
		removeItem : function(key) {
			if(!isSet) {
				var self = this;
				__tid2__ = window.setTimeout(function() {
					self.removeItem.apply(self, [key]);
				}, 100);
				return;
			}
			
			Provider.removeItem(key);
			Provider.fire("TStateProvider:remove");
		}
	};
})();