/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.sketch.Figure"]){
dojo._hasResource["dojox.sketch.Figure"]=true;
dojo.provide("dojox.sketch.Figure");
dojo.experimental("dojox.sketch");
dojo.require("dojox.gfx");
dojo.require("dojox.sketch.UndoStack");
(function(){
var ta=dojox.sketch;
ta.tools={};
ta.registerTool=function(_1,fn){
ta.tools[_1]=fn;
};
ta.Figure=function(_2){
var _3=this;
this.annCounter=1;
this.shapes=[];
this.image=null;
this.imageSrc=null;
this.size={w:0,h:0};
this.surface=null;
this.group=null;
this.node=null;
this.zoomFactor=1;
this.tools=null;
this.obj={};
dojo.mixin(this,_2);
this.selected=[];
this.hasSelections=function(){
return this.selected.length>0;
};
this.isSelected=function(_4){
for(var i=0;i<_3.selected.length;i++){
if(_3.selected[i]==_4){
return true;
}
}
return false;
};
this.select=function(_5){
if(!_3.isSelected(_5)){
_3.clearSelections();
_3.selected=[_5];
}
_5.setMode(ta.Annotation.Modes.View);
_5.setMode(ta.Annotation.Modes.Edit);
};
this.deselect=function(_6){
var _7=-1;
for(var i=0;i<_3.selected.length;i++){
if(_3.selected[i]==_6){
_7=i;
break;
}
}
if(_7>-1){
_6.setMode(ta.Annotation.Modes.View);
_3.selected.splice(_7,1);
}
return _6;
};
this.clearSelections=function(){
for(var i=0;i<_3.selected.length;i++){
_3.selected[i].setMode(ta.Annotation.Modes.View);
}
_3.selected=[];
};
this.replaceSelection=function(n,o){
if(!_3.isSelected(o)){
_3.select(n);
return;
}
var _8=-1;
for(var i=0;i<_3.selected.length;i++){
if(_3.selected[i]==o){
_8=i;
break;
}
}
if(_8>-1){
_3.selected.splice(_8,1,n);
}
};
this._c=null;
this._ctr=null;
this._lp=null;
this._action=null;
this._prevState=null;
this._startPoint=null;
this._ctool=null;
this._start=null;
this._end=null;
this._absEnd=null;
this._cshape=null;
this._dblclick=function(e){
var o=_3._fromEvt(e);
if(o){
_3.onDblClickShape(o,e);
}
};
this._keydown=function(e){
var _9=false;
if(e.ctrlKey){
if(e.keyCode===90||e.keyCode===122){
_3.undo();
_9=true;
}else{
if(e.keyCode===89||e.keyCode===121){
_3.redo();
_9=true;
}
}
}
if(e.keyCode===46||e.keyCode===8){
_3._delete(_3.selected);
_9=true;
}
if(_9){
dojo.stopEvent(e);
}
};
this._md=function(e){
if(dojox.gfx.renderer=="vml"){
_3.node.focus();
}
var o=_3._fromEvt(e);
_3._startPoint={x:e.pageX,y:e.pageY};
_3._ctr=dojo.position(_3.node);
var _a={x:_3.node.scrollLeft,y:_3.node.scrollTop};
_3._ctr={x:_3._ctr.x-_a.x,y:_3._ctr.y-_a.y};
var X=e.clientX-_3._ctr.x,Y=e.clientY-_3._ctr.y;
_3._lp={x:X,y:Y};
_3._start={x:X,y:Y};
_3._end={x:X,y:Y};
_3._absEnd={x:X,y:Y};
if(!o){
_3.clearSelections();
_3._ctool.onMouseDown(e);
}else{
if(o.type&&o.type()!="Anchor"){
if(!_3.isSelected(o)){
_3.select(o);
_3._sameShapeSelected=false;
}else{
_3._sameShapeSelected=true;
}
}
o.beginEdit();
_3._c=o;
}
};
this._mm=function(e){
if(!_3._ctr){
return;
}
var x=e.clientX-_3._ctr.x;
var y=e.clientY-_3._ctr.y;
var dx=x-_3._lp.x;
var dy=y-_3._lp.y;
_3._absEnd={x:x,y:y};
if(_3._c){
_3._c.setBinding({dx:dx/_3.zoomFactor,dy:dy/_3.zoomFactor});
_3._lp={x:x,y:y};
}else{
_3._end={x:dx,y:dy};
var _b={x:Math.min(_3._start.x,_3._absEnd.x),y:Math.min(_3._start.y,_3._absEnd.y),width:Math.abs(_3._start.x-_3._absEnd.x),height:Math.abs(_3._start.y-_3._absEnd.y)};
if(_b.width&&_b.height){
_3._ctool.onMouseMove(e,_b);
}
}
};
this._mu=function(e){
if(_3._c){
_3._c.endEdit();
}else{
_3._ctool.onMouseUp(e);
}
_3._c=_3._ctr=_3._lp=_3._action=_3._prevState=_3._startPoint=null;
_3._cshape=_3._start=_3._end=_3._absEnd=null;
};
this.initUndoStack();
};
var p=ta.Figure.prototype;
p.initUndoStack=function(){
this.history=new ta.UndoStack(this);
};
p.setTool=function(t){
this._ctool=t;
};
p.gridSize=0;
p._calCol=function(v){
return this.gridSize?(Math.round(v/this.gridSize)*this.gridSize):v;
};
p._delete=function(_c,_d){
for(var i=0;i<_c.length;i++){
_c[i].setMode(ta.Annotation.Modes.View);
_c[i].destroy(_d);
this.remove(_c[i]);
this._remove(_c[i]);
if(!_d){
_c[i].onRemove();
}
}
_c.splice(0,_c.length);
};
p.onDblClickShape=function(_e,e){
if(_e["onDblClick"]){
_e.onDblClick(e);
}
};
p.onCreateShape=function(_f){
};
p.onBeforeCreateShape=function(_10){
};
p.initialize=function(_11){
this.node=_11;
this.surface=dojox.gfx.createSurface(_11,this.size.w,this.size.h);
this.group=this.surface.createGroup();
this._cons=[];
var es=this.surface.getEventSource();
this._cons.push(dojo.connect(es,"ondraggesture",dojo.stopEvent),dojo.connect(es,"ondragenter",dojo.stopEvent),dojo.connect(es,"ondragover",dojo.stopEvent),dojo.connect(es,"ondragexit",dojo.stopEvent),dojo.connect(es,"ondragstart",dojo.stopEvent),dojo.connect(es,"onselectstart",dojo.stopEvent),dojo.connect(es,"onmousedown",this._md),dojo.connect(es,"onmousemove",this._mm),dojo.connect(es,"onmouseup",this._mu),dojo.connect(es,"onclick",this,"onClick"),dojo.connect(es,"ondblclick",this._dblclick),dojo.connect(_11,"onkeydown",this._keydown));
this.image=this.group.createImage({width:this.imageSize.w,height:this.imageSize.h,src:this.imageSrc});
};
p.destroy=function(_12){
if(!this.node){
return;
}
if(!_12){
if(this.history){
this.history.destroy();
}
if(this._subscribed){
dojo.unsubscribe(this._subscribed);
delete this._subscribed;
}
}
dojo.forEach(this._cons,dojo.disconnect);
this._cons=[];
dojo.empty(this.node);
this.group=this.surface=null;
this.obj={};
this.shapes=[];
};
p.nextKey=function(){
return "annotation-"+this.annCounter++;
};
p.draw=function(){
};
p.zoom=function(pct){
this.zoomFactor=pct/100;
var w=this.size.w*this.zoomFactor;
var h=this.size.h*this.zoomFactor;
this.surface.setDimensions(w,h);
this.group.setTransform(dojox.gfx.matrix.scale(this.zoomFactor,this.zoomFactor));
for(var i=0;i<this.shapes.length;i++){
this.shapes[i].zoom(this.zoomFactor);
}
};
p.getFit=function(){
var wF=(this.node.parentNode.offsetWidth-5)/this.size.w;
var hF=(this.node.parentNode.offsetHeight-5)/this.size.h;
return Math.min(wF,hF)*100;
};
p.unzoom=function(){
this.zoomFactor=1;
this.surface.setDimensions(this.size.w,this.size.h);
this.group.setTransform();
};
p._add=function(obj){
this.obj[obj._key]=obj;
};
p._remove=function(obj){
if(this.obj[obj._key]){
delete this.obj[obj._key];
}
};
p._get=function(key){
if(key&&key.indexOf("bounding")>-1){
key=key.replace("-boundingBox","");
}else{
if(key&&key.indexOf("-labelShape")>-1){
key=key.replace("-labelShape","");
}
}
return this.obj[key];
};
p._keyFromEvt=function(e){
var key=e.target.id+"";
if(key.length==0){
var p=e.target.parentNode;
var _13=this.surface.getEventSource();
while(p&&p.id.length==0&&p!=_13){
p=p.parentNode;
}
key=p.id;
}
return key;
};
p._fromEvt=function(e){
return this._get(this._keyFromEvt(e));
};
p.add=function(_14){
for(var i=0;i<this.shapes.length;i++){
if(this.shapes[i]==_14){
return true;
}
}
this.shapes.push(_14);
return true;
};
p.remove=function(_15){
var idx=-1;
for(var i=0;i<this.shapes.length;i++){
if(this.shapes[i]==_15){
idx=i;
break;
}
}
if(idx>-1){
this.shapes.splice(idx,1);
}
return _15;
};
p.get=function(id){
for(var i=0;i<this.shapes.length;i++){
if(this.shapes[i].id==id){
return this.shapes[i];
}
}
return null;
};
p.convert=function(ann,t){
var _16=t+"Annotation";
if(!ta[_16]){
return;
}
var _17=ann.type(),id=ann.id,_18=ann.label,_19=ann.mode,_1a=ann.tokenId;
var _1b,end,_1c,_1d;
switch(_17){
case "Preexisting":
case "Lead":
_1d={dx:ann.transform.dx,dy:ann.transform.dy};
_1b={x:ann.start.x,y:ann.start.y};
end={x:ann.end.x,y:ann.end.y};
var cx=end.x-((end.x-_1b.x)/2);
var cy=end.y-((end.y-_1b.y)/2);
_1c={x:cx,y:cy};
break;
case "SingleArrow":
case "DoubleArrow":
_1d={dx:ann.transform.dx,dy:ann.transform.dy};
_1b={x:ann.start.x,y:ann.start.y};
end={x:ann.end.x,y:ann.end.y};
_1c={x:ann.control.x,y:ann.control.y};
break;
case "Underline":
_1d={dx:ann.transform.dx,dy:ann.transform.dy};
_1b={x:ann.start.x,y:ann.start.y};
_1c={x:_1b.x+50,y:_1b.y+50};
end={x:_1b.x+100,y:_1b.y+100};
break;
case "Brace":
}
var n=new ta[_16](this,id);
if(n.type()=="Underline"){
n.transform={dx:_1d.dx+_1b.x,dy:_1d.dy+_1b.y};
}else{
if(n.transform){
n.transform=_1d;
}
if(n.start){
n.start=_1b;
}
}
if(n.end){
n.end=end;
}
if(n.control){
n.control=_1c;
}
n.label=_18;
n.token=dojo.lang.shallowCopy(ann.token);
n.initialize();
this.replaceSelection(n,ann);
this._remove(ann);
this.remove(ann);
ann.destroy();
n.setMode(_19);
};
p.setValue=function(_1e){
var obj=dojox.xml.DomParser.parse(_1e);
var _1f=this.node;
this.load(obj,_1f);
};
p.load=function(obj,n){
if(this.surface){
this.destroy(true);
}
var _20=obj.documentElement;
this.size={w:parseFloat(_20.getAttribute("width"),10),h:parseFloat(_20.getAttribute("height"),10)};
var g=_20.childrenByName("g")[0];
var img=g.childrenByName("image")[0];
this.imageSize={w:parseFloat(img.getAttribute("width"),10),h:parseFloat(img.getAttribute("height"),10)};
this.imageSrc=img.getAttribute("xlink:href");
this.initialize(n);
var ann=g.childrenByName("g");
for(var i=0;i<ann.length;i++){
this._loadAnnotation(ann[i]);
}
if(this._loadDeferred){
this._loadDeferred.callback(this);
this._loadDeferred=null;
}
this.onLoad();
};
p.onLoad=function(){
};
p.onClick=function(){
};
p._loadAnnotation=function(obj){
var _21=obj.getAttribute("dojoxsketch:type")+"Annotation";
if(ta[_21]){
var a=new ta[_21](this,obj.id);
a.initialize(obj);
this.nextKey();
a.setMode(ta.Annotation.Modes.View);
this._add(a);
return a;
}
return null;
};
p.onUndo=function(){
};
p.onBeforeUndo=function(){
};
p.onRedo=function(){
};
p.onBeforeRedo=function(){
};
p.undo=function(){
if(this.history){
this.onBeforeUndo();
this.history.undo();
this.onUndo();
}
};
p.redo=function(){
if(this.history){
this.onBeforeRedo();
this.history.redo();
this.onRedo();
}
};
p.serialize=function(){
var s="<svg xmlns=\"http://www.w3.org/2000/svg\" "+"xmlns:xlink=\"http://www.w3.org/1999/xlink\" "+"xmlns:dojoxsketch=\"http://dojotoolkit.org/dojox/sketch\" "+"width=\""+this.size.w+"\" height=\""+this.size.h+"\">"+"<g>"+"<image xlink:href=\""+this.imageSrc+"\" x=\"0\" y=\"0\" width=\""+this.size.w+"\" height=\""+this.size.h+"\" />";
for(var i=0;i<this.shapes.length;i++){
s+=this.shapes[i].serialize();
}
s+="</g></svg>";
return s;
};
p.getValue=p.serialize;
})();
}
