var throbbers = 0;
function showThrobber() {
	throbbers++;
	$('#throbber').html('<iframe style="display: none;" src="throb.php?throb=throb"></iframe>');
}
function hideThrobber() {
	throbbers--;
	if(throbbers <= 0) {
		throbbers = 0;
		$('#throbber').html('');
	}
}
var G = {
	msg: {
		block: window.alert,
		alert: humanMsg.displayMsg,
		error: function(s) { humanMsg.displayMsg('<strong>Error:</strong> '+s) },
		success: function(s) { humanMsg.displayMsg('<strong>Success:</strong> '+s) }
	},
	api: {
		process: function(tasks,cb,eb) {
			showThrobber();
			$.ajax({
				type: 'POST',
				url: 'process.php',
				data: { s: JSON.stringify(tasks) },
				cache: false,
				dataType: 'json',
				success: function() {
					hideThrobber();
					if(((!cb)||(cb.apply(this,arguments) !== false))&&(arguments[0].ex)) G.msg.error('<strong>'+arguments[0].ex+'</strong>'+(arguments[0].extext?(':<br /><em>'+arguments[0].extext+'</em>'):''));
				},
				error: function() {
					hideThrobber();
					if((!eb)||(eb.apply(this,arguments) !== false)) G.msg.error('a remote call failed.');
				}
			});
		},
		queueProcess: function(tasks,cb,eb) {
			var self = arguments.callee;
			self.process = {
				tasks: tasks,
				cb: cb,
				eb: eb
			};
			if(self.timer) clearTimeout(self.timer);
			self.timer = setTimeout(function() {
				self.timer = null;
				G.api.process(self.process.tasks,self.process.cb,self.process.eb);
			},1000);
		},
		processtest: function() {
			var script = [
				{ fn: 'importurl', url: 'http://www.google.com/intl/en_ALL/images/logo.gif' },
				{ fn: 'filter', type: 'IMG_FILTER_GAUSSIAN_BLUR' },
				{ fn: 'rotate', angle: '45' }
			];
			G.api.process(script,function(json) {
				G.msg.alert(json.path);
			});
		}
	},
	iface: {
		image: function(src,alt) {
			if(src != undefined) {
				if(!src) src = 'gfx/blank.gif';
				showThrobber();
				$('#image').load(hideThrobber).attr('src',arguments[0]).attr('alt',arguments[1]);
			}
			return $('#image').attr('src');
		},
		imageurl: function() {
			return 'http://inportb.com/imagine/'+$('#image').attr('src');
		},
		menu: function(item) {
			var fn = item.split('-').join('$');
			if(G.iface.handler[fn]) G.iface.handler[fn](null);
			else G.msg.error(item+' is not implemented');
		},
		dialog: function(title,bodydom,close) {
			if(arguments.callee.close) arguments.callee.close();
			arguments.callee.close = null;
			if(!title) {
				$('#dlgbox').hide('fast');
				return;
			}
			$('#dlgtitle').html(title);
			$('#dlgbody').html('');
			$('#dlgbody').createAppend('div',{},bodydom);
			arguments.callee.close = close;
			$('#dlgbox').show('fast');
			$('#dlgbox').animate({ opacity: 0.1 },200).animate({ opacity: 1.0 },200).animate({ opacity: 0.1 },200).animate({ opacity: 1.0 },200);
		},
		operation: {
			add: function(param,o,method,cb) {
				var name = param.name?param.name:param.fn;
				if(param.name != undefined) delete param.name;
				if(o) {
					$(o).html(name).attr('title',JSON.stringify(param)).attr('param',param);
				} else $('#actionlist').createAppend('li',{ onclick: function(e) {
					if(e.shiftKey) {
						this.style.fontStyle = this.style.fontStyle=='italic'?'normal':'italic';
						G.iface.operation.execpath();
					}
				}, ondblclick: function(e) {
					if(e.shiftKey) {
						G.iface.operation.remove(this);
						G.iface.operation.execpath();
					} else method(param,this);
				}, title: JSON.stringify(param), param: param },name);
				this.execpath(cb);
			},
			remove: function(o) {
				o.parentNode.removeChild(o);
			},
			getpath: function() {
				var script = [];
				$('#actionlist > li').each(function() {
					if(this.style.fontStyle != 'italic') script.push(this.param);
				});
				return script;
			},
			execpath: function(cb) {
				G.api.queueProcess(G.iface.operation.getpath(),function(json) {
					G.iface.image(json.path,json.rsrc);
					if(cb) cb(json);
				});
			}
		},
		handler: {
			file$importurl: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				var url = param.url?param.url:'';
				G.iface.dialog('Import from URL',[
					'form',{ onsubmit: function() {
							var url = $('#file-importurl-url').val();
							if(!url) return false;
							param.fn = 'importurl';
							param.url = url;
							param.name = 'import: URL';
							G.iface.operation.add(param,o,self,null);
							$('#file-importurl-url').val('');
							G.iface.dialog();
							return false;
						}},[
						'div',{},[
							'input',{ type: 'text', id: 'file-importurl-url', style: 'width: 100%;' },'',
							'input',{ type: 'submit' },''
						]
					]
				]);
				$('#file-importurl-url').val(url).Watermark('URL');
			},
			file$importbkm: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				var url = param.url?param.url:'';
				G.iface.dialog('Import Bookmarklet',[
					'p',{},[
						'a',{ href: "javascript:d='';for(i=0;i<document.images.length;i++){d+='<img src=\"'+document.images[i].src+'\" onclick=\"location.replace(\\'http://inportb.com/imagine/?url='+escape(document.images[i].src)+'\\')\"><br />'};if(d!=''){document.write('<center>'+d+'</center>');void(document.close())}else{alert('No images!')}", style: 'border: 1px solid white; font-weight: bold; color: white;' },'Edit Images'
					],
					'p',{},'Drag the above bookmarklet into your bookmarks toolbar or links bar. To edit an image on a web-page, activate the bookmarklet and click the image of choice.'
				]);
			},
			file$exportdownload: function(param,o) {
				G.iface.dialog();
				location.replace('download.php?rsrc='+escape($('#image').attr('alt')));
			},
			file$exportimageshack: function(param,o) {
				G.iface.dialog();
				window.open('http://imageshack.us/transload.php?rembar=1&url='+escape(G.iface.imageurl()),'exported to ImageShack','');
			},
			file$exportwebsrc: function(param,o) {
				G.iface.dialog();
				window.open('http://websrc.us/transload/?tag=editor_imagine&url='+escape(G.iface.imageurl()),'exported to WebSrc','');
			},
			file$exportkimages: function(param,o) {
				G.iface.dialog();
				window.open('http://kimag.es/download/do.php?url='+escape(G.iface.imageurl()),'exported to KImages','');
			},
			adjust$crop: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				var img = $('#image')[0];
				img = { sx: img.width, sy: img.height };
				var ix = param.ix?param.ix:0;
				var iy = param.iy?param.iy:0;
				var sx = param.sx?param.sx:img.sx;
				var sy = param.sy?param.sy:img.sy;
				var c = $('#cpane').html();
				G.iface.dialog('Crop',[
					'form',{ onsubmit: function() {
							var ix = $('#adjust-crop-ix').val();
							var iy = $('#adjust-crop-iy').val();
							var sx = $('#adjust-crop-sx').val();
							var sy = $('#adjust-crop-sy').val();
							if((sx == 0)||(sy == 0)||((sx == img.sx)&&(sy == img.sy))) return false;
							$('#cpane').html(c);
							param.fn = 'crop';
							param.ix = ix;
							param.iy = iy;
							param.sx = sx;
							param.sy = sy;
							param.name = 'adjust: crop';
							G.iface.operation.add(param,o,self,null);
							$('#adjust-crop-ix').val('');
							$('#adjust-crop-iy').val('');
							$('#adjust-crop-sx').val('');
							$('#adjust-crop-sy').val('');
							G.iface.dialog();
							return false;
						}},[
						'div',{},[
							'input',{ id: 'adjust-crop-ix', style: 'width: 3em;' },'',
							'span',{},':',
							'input',{ id: 'adjust-crop-iy', style: 'width: 3em;' },'',
							'span',{},', ',
							'input',{ id: 'adjust-crop-sx', style: 'width: 3em;' },'',
							'span',{},'&times;',
							'input',{ id: 'adjust-crop-sy', style: 'width: 3em;' },'',
							'br',{},'',
							'input',{ type: 'submit' },''
						]
					]
				],function() {
					$('#cpane').html(c);
				});
				function reset() {
					$('#adjust-crop-ix').val(0).Watermark('left');
					$('#adjust-crop-iy').val(0).Watermark('top');
					$('#adjust-crop-sx').val(0).Watermark('width');
					$('#adjust-crop-sy').val(0).Watermark('height');
				}
				function change(d) {
					if((d.w == 0)||(d.h == 0)) {
						reset();
						return;
					}
					$('#adjust-crop-ix').val(d.x);
					$('#adjust-crop-iy').val(d.y);
					$('#adjust-crop-sx').val(d.w);
					$('#adjust-crop-sy').val(d.h);
				}
				reset();
				$('#image').Jcrop({ onChange: change, onSelect: change, bgColor: 'transparent' });
			},
			adjust$resize: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				var width = param.width?param.width:0;
				var height = param.height?param.height:0;
				var img = $('#image')[0];
				G.iface.dialog('Resize',[
					'form',{ onsubmit: function() {
							var width = Math.round($('#adjust-resize-width').val());
							var height = Math.round($('#adjust-resize-height').val());
							if(!((width)&&(height))||((width == img.width)&&(height == img.height))) return false;
							param.fn = 'resize';
							param.width = width;
							param.height = height;
							param.name = 'adjust: resize';
							G.iface.operation.add(param,o,self,null);
							$('#adjust-resize-width').val('');
							$('#adjust-resize-height').val('');
							G.iface.dialog();
							return false;
						}},[
						'div',{},[
							'input',{ id: 'adjust-resize-width', style: 'width: 5em;' },'',
							'span',{},'&times;',
							'input',{ id: 'adjust-resize-height', style: 'width: 5em;' },'',
							'br',{},'',
							'input',{ id: 'adjust-resize-ratio', type: 'checkbox', checked: 'checked' },'',
							'input',{ type: 'submit' },''
						]
					]
				]);
				$('#adjust-resize-width').val(img.width).Watermark('width').change(function() {
					if(!$('#adjust-resize-ratio').attr('checked')) return;
					var sx = $(this).val();
					var sy = $('#adjust-resize-height').val();
					try {
						if(Math.abs(1-(sx/sy)/(img.width/img.height)) > 0.01) $('#adjust-resize-height').val(sx*img.height/img.width);
					} catch(e) {}
				});
				$('#adjust-resize-height').val(img.height).Watermark('height').change(function() {
					if(!$('#adjust-resize-ratio').attr('checked')) return;
					var sy = $(this).val();
					var sx = $('#adjust-resize-width').val();
					try {
						if(Math.abs(1-(sx/sy)/(img.width/img.height)) > 0.01) $('#adjust-resize-width').val(sy*img.width/img.height);
					} catch(e) {}
				});
			},
			adjust$rotate: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				var value = param.angle?param.angle:0;
				G.iface.dialog('Rotate',[
					'form',{ onsubmit: function() {
							var value = $('#adjust-rotate-value').val();
							if(!value) return false;
							param.fn = 'rotate';
							param.angle = value;
							param.name = 'adjust: rotate';
							G.iface.operation.add(param,o,self,null);
							$('#adjust-rotate-value').val('');
							G.iface.dialog();
							return false;
						}},[
						'div',{},[
							'input',{ id: 'adjust-rotate-value' },'',
							'input',{ type: 'submit' },''
						]
					]
				]);
				$('#adjust-rotate-value').spinner({ start: value, stepping: 1 });
			},
			adjust$reflect: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				var value = param.type?param.type:'';
				G.iface.dialog('Reflect',[
					'form',{ onsubmit: function() {
							var horizontal = $('#adjust-reflect-horizontal').is(':checked');
							var vertical = $('#adjust-reflect-vertical').is(':checked');
							var value = ((horizontal)&&(vertical))?'both':(horizontal?'horizontal':(vertical?'vertical':''));
							if(!value) return false;
							param.fn = 'reflect';
							param.type = value;
							param.name = 'adjust: reflect';
							G.iface.operation.add(param,o,self,null);
							G.iface.dialog();
							return false;
						}},[
						'div',{},[
							'input',{ id: 'adjust-reflect-horizontal', type: 'checkbox', checked: (((value=='horizontal')||(value=='both'))?'checked':'') },'',
							'span',{},'horizontal ',
							'input',{ id: 'adjust-reflect-vertical', type: 'checkbox', checked: (((value=='vertical')||(value=='both'))?'checked':'') },'',
							'span',{},'vertical ',
							'input',{ type: 'submit' },''
						]
					]
				]);
			},
			adjust$gammacorrect: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				var input = param.input?param.input:'';
				var output = param.output?param.output:'';
				G.iface.dialog('Gamma-correct',[
					'form',{ onsubmit: function() {
							var input = $('#adjust-gammacorrect-input').val();
							var output = $('#adjust-gammacorrect-output').val();
							param.fn = 'gammacorrect';
							param.input = input;
							param.output = output;
							param.name = 'adjust: gammacorrect';
							G.iface.operation.add(param,o,self,null);
							$('#adjust-gammacorrect-input').val('');
							$('#adjust-gammacorrect-input').val('');
							G.iface.dialog();
							return false;
						}},[
						'div',{},[
							'input',{ id: 'adjust-gammacorrect-input' },'',
							'input',{ id: 'adjust-gammacorrect-output' },'',
							'input',{ type: 'submit' },''
						]
					]
				]);
				$('#adjust-gammacorrect-input').val(input).Watermark('input');
				$('#adjust-gammacorrect-output').val(output).Watermark('output');
			},
			filter$negate: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				G.iface.dialog();
				param.fn = 'filter';
				param.type = 'negate';
				param.name = 'filter: invert';
				G.iface.operation.add(param,o,self,null);
			},
			filter$grayscale: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				G.iface.dialog();
				param.fn = 'filter';
				param.type = 'grayscale';
				param.name = 'filter: desaturate';
				G.iface.operation.add(param,o,self,null);
			},
			filter$brightness: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				param.args = param.args?param.args:{};
				var value = param.args[0]?param.args[0]:0;
				G.iface.dialog('Brighten',[
					'form',{ onsubmit: function() {
							var value = $('#filter-brightness-value').val();
							if(!value) return false;
							param.fn = 'filter';
							param.type = 'brightness';
							param.args = [value];
							param.name = 'filter: brighten';
							G.iface.operation.add(param,o,self,null);
							$('#filter-brightness-value').val('');
							G.iface.dialog();
							return false;
						}},[
						'div',{},[
							'input',{ id: 'filter-brightness-value' },'',
							'input',{ type: 'submit' },''
						]
					]
				]);
				$('#filter-brightness-value').spinner({ min: -255, max: 255, start: value, stepping: 1 });
			},
			filter$contrast: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				param.args = param.args?param.args:{};
				var value = param.args[0]?param.args[0]:0;
				G.iface.dialog('Contrast',[
					'form',{ onsubmit: function() {
							var value = $('#filter-contrast-value').val();
							if(!value) return false;
							param.fn = 'filter';
							param.type = 'contrast';
							param.args = [value];
							param.name = 'filter: contrast';
							G.iface.operation.add(param,o,self,null);
							$('#filter-contrast-value').val('');
							G.iface.dialog();
							return false;
						}},[
						'div',{},[
							'input',{ id: 'filter-contrast-value' },'',
							'input',{ type: 'submit' },''
						]
					]
				]);
				$('#filter-contrast-value').spinner({ min: -100, max: 100, start: value, stepping: 1 });
			},
			filter$colorize: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				param.args = param.args?param.args:{};
				var red = param.args[0]?param.args[0]:0;
				var green = param.args[1]?param.args[1]:0;
				var blue = param.args[2]?param.args[2]:0;
				G.iface.dialog('Colorize',[
					'form',{ onsubmit: function() {
							var red = $('#filter-colorize-red').val();
							var green = $('#filter-colorize-green').val();
							var blue = $('#filter-colorize-blue').val();
							if(!((red)||(green)||(blue))) return false;
							param.fn = 'filter';
							param.type = 'colorize';
							param.args = [red,blue,green];
							param.name = 'filter: colorize';
							G.iface.operation.add(param,o,self,null);
							$('#filter-colorize-red').val('');
							$('#filter-colorize-green').val('');
							$('#filter-colorize-blue').val('');
							G.iface.dialog();
							return false;
						}},[
						'div',{},[
							'input',{ id: 'filter-colorize-red', style: 'background: #f77;' },'',
							'input',{ id: 'filter-colorize-green', style: 'background: #7f7;' },'',
							'input',{ id: 'filter-colorize-blue', style: 'background: #77f;' },'',
							'input',{ type: 'submit' },''
						]
					]
				]);
				$('#filter-colorize-red').spinner({ min: -255, max: 255, start: red, stepping: 1 });
				$('#filter-colorize-green').spinner({ min: -255, max: 255, start: green, stepping: 1 });
				$('#filter-colorize-blue').spinner({ min: -255, max: 255, start: blue, stepping: 1 });
			},
			filter$edgedetect: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				G.iface.dialog();
				param.fn = 'filter';
				param.type = 'edgedetect';
				param.name = 'filter: edge-detect';
				G.iface.operation.add(param,o,self,null);
			},
			filter$emboss: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				G.iface.dialog();
				param.fn = 'filter';
				param.type = 'emboss';
				param.name = 'filter: emboss';
				G.iface.operation.add(param,o,self,null);
			},
			filter$gaussianblur: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				G.iface.dialog();
				param.fn = 'filter';
				param.type = 'gaussian_blur';
				param.name = 'filter: Gaussian blur';
				G.iface.operation.add(param,o,self,null);
			},
			filter$selectiveblur: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				G.iface.dialog();
				param.fn = 'filter';
				param.type = 'selective_blur';
				param.name = 'filter: selective blur';
				G.iface.operation.add(param,o,self,null);
			},
			filter$meanremoval: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				G.iface.dialog();
				param.fn = 'filter';
				param.type = 'mean_removal';
				param.name = 'filter: mean removal';
				G.iface.operation.add(param,o,self,null);
			},
			filter$smooth: function(param,o) {
				var self = arguments.callee;
				var param = param?param:{};
				param.args = param.args?param.args:{};
				var value = param.args[0]?param.args[0]:0;
				G.iface.dialog('Smooth',[
					'form',{ onsubmit: function() {
							var value = $('#filter-smooth-value').val();
							if(!value) return false;
							param.fn = 'filter';
							param.type = 'smooth';
							param.args = [value];
							param.name = 'filter: smooth';
							G.iface.operation.add(param,o,self,null);
							$('#filter-smooth-value').val('');
							G.iface.dialog();
							return false;
						}},[
						'div',{},[
							'input',{ id: 'filter-smooth-value' },'',
							'input',{ type: 'submit' },''
						]
					]
				]);
				$('#filter-smooth-value').val(value);
			}
		}
	}
};
window.alert = G.msg.alert;
