/**
 * @author shom
 */

XSU={
	_cnt:0,
	XsUpload:function XsUpload(e,f){
		this.form=e;
		this.callback=f;
	
		XSU._cnt++;
		e.target="xsuploadresult"+XSU._cnt;

		var uri=G.parseUri(e.action);
		this.callbackname="XSU._xsu"+XSU._cnt;
		XSU["_xsu"+XSU._cnt]=this.callback;
		uri.params._callback=this.callbackname;
		
		this.uri=uri;

		this.form.action=this.uri.toString();
		
		var div=document.createElement("div");
		div.id=e.target+"result";
		div.innerHTML="<iframe name=\""+e.target+"\" src=\"js/1x1.gif\" />";
		div.style.cssText="width:0; height:0; border:none; position:absolute; top:-1000px; left:-1000px; overflow:hidden; display:none;";
		document.body.appendChild(div);
		 if (G.isSafari&&frames[this.form.target]) {
			window.open("js/1x1.gif", this.form.target);
		}
		this.result=div;
		
		if(uri.hostname!=G.parseUri(location.href).hostname){
			var tmpimg=G.$S("img")[0]; if(!tmpimg){alert("cannot XsUpload without img located on same domain");return;}
			this.tmpimg=tmpimg;
			this.uri.params._img=this.tmpimg.src;
			this.form.action=this.uri.toString();
			var onsubmithandler=(function(){
				this.oldhash="";
				this.result.style.display="block";
				this.timer=setInterval((function(){
					var gethash=(function(){
						try{
							if(frames[this.form.target].frames[0]){
								return window.G.parseUri(frames[this.form.target].frames[0].location.href).hash;
							}
						}catch(ex){}
						return "";
					}).bindThis(this);
					var sethash=(function(hash){
						try{
							if(frames[this.form.target].frames[0]){
								return frames[this.form.target].frames[0].location.hash=hash;
							}
						}catch(ex){}
						return "";
					}).bindThis(this);
					var newloc=gethash();
					if(newloc!=this.oldhash){
						this.oldhash=newloc;
						this.result.style.display="none";
						var hash=this.oldhash;
						var m=hash.match(/^#?xsuf(\d+):(.*)$/);
						if(m){
							(function(all,i){
								var hash=gethash();
								if(hash=="xsuend"){
									eval(this.callbackname+"("+all+")");
									return;
								}
								var m=hash.match(/^xsuf(\d+):(.*)$/);
								if(m){
									arguments.callee.later(50,this,all+m[2],m[1]);
									sethash("wait");
								}else{
									arguments.callee.later(50,this,all,i);
								}
							}).bindThis(this)(m[2],m[1]);
						}else{
							eval(this.callbackname+"("+this.oldhash+")");
						}
					}
				}).bindThis(this),100);
			}).bindThis(this);
			if(!this.form.id){
				this.form.id="xsuform"+XSU._cnt;
			}
			/*
			XSU._onsubmithandlers[this.form.id]=onsubmithandler;
			*/
			onsubmithandler();
			// cannot use below with "form/multipart"
			//G.addEvent(this.form,"submit",onsubmithandler);
			//this.form.onsubmit=onsubmithandler;
			//this.form.setAttribute("onsubmit",onsubmithandler.toSource());
		}
		
	},

	retXsUpload:function retXsUpload(r){
		var uri=G.parseUri(location.href);
		//var callback=uri.params._callback||"M.uploadComplete";
		var callback=uri.params._callback;
		if(!callback){
			calback=uri.path.replace(/\/+$/,"").split("/").pop();
			if(callback=="ja"||callback=="en"){
				callback="M.uploadComplete";
			}
		}
		try{
			callback=eval("parent."+callback+"||parent.defaultView."+callback);
		}catch(ex){
			var ifr=document.createElement("iframe");
			//ifr.name="hashres";
			var ret=G.toJSON(r);
			if(ret.length>100){
				ret=ret.match(/(.{0,100})/g);
				ifr.src=uri.params._img+"#wait";
				(function(ifr,base,ret,i){
					var url=G.parseUri(ifr.src);
					if(url.hash!="wait"){
						arguments.callee.later(50,this,ifr,base,ret,i);
						return;
					}
					i++;
					if(ret[0]){
						ifr.src=base+"#"+"xsuf"+(i++)+":"+ret.shift();
					}else{
						ifr.src=base+"#xsuend";
					}
				})(ifr,uri.params._img,ret,0)
			}
			ifr.src=uri.params._img+"#"+G.toJSON(r);
			document.body.appendChild(ifr);
			return;
		}
		callback&&callback(r);
	},
	
	onsubmit:function(ev,form){
		XSU._onsubmithandlers[form.id]&&XSU._onsubmithandlers(ev);
	},
	
	_onsubmithandlers:{}
};
