﻿if(!Array.prototype.indexOf)
	Array.prototype.indexOf=function(s){for(var a=0;a<this.length;a++)if(this[a]==s)return a;return-1};

var Z1 = 1000;

MapView={
	vmView:1,
	vmSubmite:2,
	vmEdit:3,
	viewMode:1,
	// methods
	init:function(mapContainerId,mapImageId,socketsContainerId,viewMode, LoadSignDefsFunc,LoadSignsFunc,LoadUsersSignsFunc,SaveUsersSignsFunc){
		var t=this;
		t.viewMode=viewMode||t.vmView;
		t.saveUsersSignsFunc=SaveUsersSignsFunc;
		t.signDefs=[];
		t.signDefsById=[];
		
		t.containerElm=pdcore.getElm(mapContainerId);
		t.mapImageElm=pdcore.getElm(mapImageId);
		
		if(typeof(LoadSignDefsFunc) == "function")
			try{LoadSignDefsFunc(t);}catch(E){}

		if(t.viewMode != t.vmView) {
			t.socketsContainerElm=pdcore.getElm(socketsContainerId);
			if(t.socketsContainerElm){
				t.createSockets(t.socketsContainerElm);
				pdcore.show(t.socketsContainerElm);
			}
		}
		if(typeof(LoadSignsFunc) == "function")
			try{LoadSignsFunc(t);}catch(E){}

		if(typeof(LoadUsersSignsFunc) == "function")
			try{LoadUsersSignsFunc(t);}catch(E){}
			
		t.onUserSignChanged();
		
		pdcore.addToUnload(t);
	},
	unload:function(){
		var t=MapView;
		t.containerElm=null;
		t.mapImageElm=null;
		t.socketsContainerElm=null;
		pdcore.cleanupArray(t.signDefs);
	},
	onUserSignChanged:function(){
		var t=MapView;
		if (t.saveUsersSignsFunc)
			try{t.saveUsersSignsFunc(t.getSigns());}catch(E){}
	},
	createSockets:function(cont){
		for (var i = 0; i < this.signDefs.length; i++)
			this.signDefs[i].createSocket(cont);
	},
	getSigns:function(bJustNew){
		if(bJustNew!=true)bJustNew=false;
		var res="";
		for(var i=0;i<this.signDefs.length;i++)
			res+=this.signDefs[i].toString(bJustNew);
		return res;
	},
	createSignDef:function(id,name,small_image,big_image,big_image_w,big_image_h){
		this.addSignDef(new MapView.SignDef(this,id,name,small_image,big_image,big_image_w,big_image_h));
	},
	addSignDef:function(signDef){
		this.signDefs.push(signDef);
		this.signDefsById[signDef.id]=signDef;
	},
	getSignDef:function(id){
		return this.signDefsById[id];
	},
	createSign:function(signDefId,signId,x,y,isNew){
		var signDef = this.getSignDef(signDefId);
		if(signDef)
			signDef.createSign(signId,x,y,isNew);
	},
	getMapWidth:function(){
		return pdcore.getW(this.mapImageElm);
	},
	getMapHeight:function(){
		return pdcore.getH(this.mapImageElm);
	}
}

MapView.SignDef=function(map,id,name,small_image,big_image,w,h){
	var t = this;
	t.w=w||24;
	t.h=h||24;
	t.map=map;
	t.id=id;
	t.name=name;
	t.small_image=small_image;
	t.big_image=big_image;
	t.signs=[];
	t.socket=null;
	t.signToDrag=null;
}
MapView.SignDef.prototype={
	unload:function(){
		var t = this;
		if(t.socket){
			t.socket.signDef=null;
			t.socket = null;
		}
		pdcore.cleanupArray(t.signs);
	},
	createSign:function(id,x,y,isNew){
		return new MapView.Sign(this.map, this, id,x,y,isNew,false);
	},
	getSignToDrag:function(){
		if(!this.signToDrag){
			this.signToDrag=new MapView.Sign(this.map, this, 0,0,0,true,true);
		}
		return this.signToDrag;
	},
	createSocket:function(p,w,h){
		var t=this;
		if(!t.socket){
			var socket = t.socket =  pdcore.createElm(p,"DIV");
			socket.signDef=t;
			
			t.fillSignSocket(socket, w || 24, h || 24);
			Drag.turnOnDrag(socket, t.drag_Start, t.drag_Do, t.drag_Stop);
		}
		return t.socket;
	},
	// do not rename this function, it could be overriden in some pages
	fillSignSocket:function(socket,w,h){
		var t=this;
		var img = pdcore.createElm(socket,"IMG");
		img.alt = t.name;
		img.title = t.name;
		img.src = t.small_image;
		pdcore.setSize(img, w,h);
		pdcore.setSize(socket, w,h);
	},
	toString:function(bJustNew){
		var res="";
		for(var i=0;i<this.signs.length;i++){
			var sign=this.signs[i];
			if(sign){
				if((bJustNew==false)||(bJustNew==true && sign.isNew==true))
					res+=this.id+"_"+sign.toString()+" ";
			}
		}
		return res;
	},
	drag_Start:function(eX,eY,target,event){
		var elm = target.signDef.getSignToDrag().elm;
		var x = target.offsetLeft + target.parentNode.offsetLeft;
		var y = target.offsetTop + target.parentNode.offsetTop;
		var evtXY = pdcore.events.getOffsetXY(event);
		x+=evtXY[0];x-=(elm.offsetWidth||target.signDef.w)/2;
		y+=evtXY[1];y-=(elm.offsetHeigh||target.signDef.h)/2;
		elm._x=x;
		elm._y=y;
		pdcore.moveTo(elm, x, y);
		pdcore.setZ(elm, Z1);
		pdcore.show(elm);
	},
	drag_Do:function(eX,eY,dX,dY,target,event,dx,dy){
		var elm = target.signDef.getSignToDrag().elm;
		elm.style.left = elm._x + dX;
		elm.style.top = elm._y + dY;
	},
	drag_Stop:function(eX,eY,dX,dY,target,event){
		var sign = target.signDef.getSignToDrag();
		sign.checkLocation();
	}
}

MapView.Sign=function(map,signDef,id,x,y,isNew,forDrag){
	var t = this;
	t.id=id;
	t.isNew=(!(isNew==false));
	t.signDef=signDef;
	t.map = map;

	x=x||0;
	y=y||0;
	if(map.mapImageElm && x>0 && y>0){
		x+=pdcore.getX(map.mapImageElm);
		y+=pdcore.getY(map.mapImageElm);
	}

	t.elm = pdcore.createElm(map.containerElm, "DIV", "absolute", x, y, signDef.w, signDef.h);
	t.elm._owner=t;
	pdcore.setZ(t.elm, Z1);

	t.img = pdcore.createElm(t.elm, "IMG");
	t.img.alt = signDef.name;
	t.img.title = signDef.name;
	t.img.src = signDef.big_image;
	
	// check location for exists signs
	if(!forDrag)t.checkLocation();
}
MapView.Sign.prototype={
	unload:function(){
		var t = this;
		if(t.elm){
			t.elm._owner = null;
			t.elm = null;
			t.img = null;
		}
	},
	checkLocation:function(){
		var t=this;
		var pos = t.getPos();
		if(pos && pos.x > 0 && pos.x < t.map.getMapWidth() && pos.y > 0 && pos.y < t.map.getMapHeight())
			t.placeIntoContainer();
		else
			t.removeFromContainer();
		t.map.onUserSignChanged();
	},
	toString:function(){
		var pos = this.getPos();
		if(pos && pos.x > 0 && pos.y > 0){
			return pos.x+"_"+pos.y;
		}
		return null;
	},
	getPos:function(){
		var t=this;
		if (t.map && t.map.mapImageElm){
			var x,y;
			x=pdcore.getX(t.elm);
			y=pdcore.getY(t.elm);
			if(x>0 && y>0){
				//????
				x-=pdcore.getX(t.map.mapImageElm);
				y-=pdcore.getY(t.map.mapImageElm);
				return {x:x,y:y};
			}
		}
		return {x:0,y:0};
	},
	placeIntoContainer:function(){
		var t=this;
		if(pdcore.getX(t.elm)>0 && pdcore.getY(t.elm)>0){
			if(t.signDef.signs.indexOf(t)<0)
				t.signDef.signs.push(t);
			if(t.signDef.signToDrag==this)
				t.signDef.signToDrag=null;
			//can drag: 
			//		1. In EditMode 
			//		2. Not ViewMode but just new signs
			if((t.map.viewMode == t.map.vmEdit) || (t.isNew && t.map.viewMode != t.map.vmView)){
				Drag.turnOnDrag(t.elm, t.drag_Start, t.drag_Do, t.drag_Stop);
			}
			pdcore.show(t.elm);
		}
	},
	removeFromContainer:function(){
		var t=this;
		var i=t.signDef.signs.indexOf(t);
		if(i>=0)
			t.signDef.signs[i]=null;
		Drag.turnOffDrag(t.elm);
		pdcore.hide(t.elm);
	},
	drag_Start:function(eX,eY,target,event){
		pdcore.setZ(target, Z1);
	},
	drag_Do:function(eX,eY,dX,dY,target,event,dx,dy){
		target.style.left = eX;
		target.style.top = eY;
	},
	drag_Stop:function(eX,eY,dX,dY,target,event){
		try{target._owner.checkLocation();}catch(E){}
	}
}
