1 /// <reference path="../jquery/js/jquery-1.10.2.min.js" />
  2 /// <reference path="../Scripts/common.js" />
  3 var g_x; //当前マウスX座標
  4 var g_y; //当前マウスY座標
  5 var scaleX = 1; // X軸の倍率
  6 var scaleY = 1; // Y軸の倍率
  7 var scaleXY = 1; //X軸およびY軸の倍率
  8 var c; //キャンバス
  9 var img; //画像
 10 var imgW = 0; //画像の幅
 11 var imgH = 0; //画像の高さ
 12 var imgShowW = 0; //画像ショーの実際の幅
 13 var imgShowH = 0; //画像ショーの実際の高さ
 14 var imgOffsetX = 0; //X軸の移動距離
 15 var imgOffsetY = 0; //Y軸の移動距離
 16 var popupDivX = 0; //Xポップアップボックスの座標
 17 var popupDivY = 0; //Yポップアップボックスの座標
 18 var timeFn = null; //遅延実行
 19 var asc = false; //拡大のFLG
 20 var desc = false; //狭いのFLG
 21 var startStationNo = false; //出発駅を選択のFLG
 22 var endStationNo = true; //到着駅を選択のFLG
 23 var windowWidth = 0; //キャンバスの幅
 24 var windowHeight = 0; //キャンバスの高さ
 25 var isFind = true; //駅を選択のFLG
 26 var pointerX1 = 0; //第一個の指の横座標
 27 var pointerY1 = 0; //第一個の指の縦座標
 28 var pointerX2 = 0; //2つ目の指の横座標
 29 var pointerY2 = 0; //2つ目の指の縦座標
 30 var preX = 0; //上のX軸の位置
 31 var preY = 0;  //上のY軸の位置
 32 var isGesture = false;  //触れるのFLG
 33 
 34 
 35 $(document).ready(function () {
 36 
 37     var main_contents = $(".main-contents");
 38     windowWidth = main_contents.width(); //キャンバスの幅セットする
 39     windowHeight = main_contents.height();
 40 
 41     image_path ="xxxxx.img";
 42     c = document.getElementById("canvas_id");
 43     //キャンバスの位置セットする
 44     canvasPosition.x = $(c).offset().left;
 45     canvasPosition.y = $(c).offset().top;
 46     //キャンバスのサイズセットする
 47     c.height = windowHeight;
 48     c.width = windowWidth;
 49     //キャンバスを作成する
 50     cxt = c.getContext("2d");
 51     img = document.createElement('img');
 52     img.src = image_path; //イメージのパース
 53     //イメージを描画する
 54     img.addEventListener('load', eventPhotoLoaded, false);
 55     function eventPhotoLoaded() {
 56         imgW = img.width;
 57         imgH = img.height;
 58         imgShowW = imgW;
 59         imgShowH = imgH;
 60         //画像の縦横比を維持するため
 61         var zw = windowHeight * (imgW / imgH);
 62         var xx = zw - windowWidth;
 63         scaleX = imgShowW / (imgShowW - ((imgShowW / windowWidth) * xx));
 64         imgShowW = imgW / scaleX;
 65         scaleXY = scaleX / scaleY;
 66 
 67         //ジェスチャーイベントを追加
 68 //        setGesture();
 69     }
 70 
 71 
 72     //キーボードのキー
 73     document.onkeydown = function (e) {
 74         writeEventLog("onkeydown", "画面キーダウンイベント");
 75         e = e ? e : window.event;
 76         arv_address.arv_node = "";
 77         arv_address.arv_hyper = "";
 78         arv_address.arv_num = "";
 79         $("#ekiPanel").animate({ opacity: "hide" }, 50);
 80         var x = 10 / scaleX;
 81         var y = 10 / scaleY;
 82         switch (e.keyCode) {
 83             case 38:
 84                 //上へ
 85                 moveMap(0, -y);
 86                 break;
 87             case 40:
 88                 //下へ
 89                 moveMap(0, y);
 90                 break;
 91             case 37:
 92                 //左へ
 93                 moveMap(-x, 0);
 94                 break;
 95             case 39:
 96                 //右へ
 97                 moveMap(x, 0);
 98         }
 99     }
100 });
101 
102 
103 //画像表示サイズを設定する
104 function setShowWH() {
105     if (scaleX != 0) {
106         imgShowW = imgW / scaleX;
107         if (scaleX <= 1) {
108             imgShowW = imgW;
109         }
110         if (imgShowW + imgOffsetX >= imgW) {
111             imgOffsetX = imgW - imgShowW;
112         }
113     }
114     if (scaleY != 0) {
115         imgShowH = imgH / scaleY;
116         if (scaleY <= 1) {
117             imgShowH = imgH;
118         }
119         if (imgShowH + imgOffsetY >= imgH) {
120             imgOffsetY = imgH - imgShowH;
121         }
122     }
123 }
124 //画像をダブルクリックします
125 function doubleclickmap(event) {
126     writeEventLog("doubleclickmap", "canvasダブルクリック");
127     $("#ekiPanel").animate({ opacity: "hide" }, 300);
128     arv_address.arv_node = "";
129     arv_address.arv_hyper = "";
130     arv_address.arv_num = "";
131     clearTimeout(timeFn);
132 
133     //マウスの位置を取得する
134     var x = event.pageX - canvasPosition.x;
135     var y = event.pageY - canvasPosition.y;
136 
137     //イメージポイントを取得する
138     g_x = ((imgW / scaleX) * (x / windowWidth)) + imgOffsetX;
139     g_y = ((imgH / scaleY) * (y / windowHeight)) + imgOffsetY;
140     upSize();
141     setZoom(g_x, g_y, x, y);
142 }
143 //画像を拡大または縮小
144 function setZoom(imgX, imgY, canvasX, canvasY) {
145     //  0.5:センター x / windowWidth=0.5   2:2倍のサイズ
146     // var centerG_x = ((imgW / scaleX) * 0.5)*(scaleX / 2) + imgOffsetX;
147     // 上記によると、出ていた  画像は、ポイントの現在の位置を変更した後
148     var centerG_x = (imgW * canvasX) / (windowWidth * scaleX) + imgOffsetX;
149     var centerG_y = (imgH * canvasY) / (windowHeight * scaleY) + imgOffsetY;
150     //設定された画像の位置
151     var offsetX = (imgX - centerG_x) + imgOffsetX;
152     var offsetY = (imgY - centerG_y) + imgOffsetY;
153     setShowWH();
154     //境界の判断
155     if (offsetX < 0) {
156         imgOffsetX = 0;
157     }
158     else if (imgShowW + offsetX > imgW) {
159         imgOffsetX = imgW - imgShowW;
160     }
161     else {
162         imgOffsetX = offsetX;
163     }
164 
165     if (offsetY < 0) {
166         imgOffsetY = 0;
167     }
168     else if (imgShowH + offsetY > imgH) {
169         imgOffsetY = imgH - imgShowH;
170     }
171     else {
172         imgOffsetY = offsetY;
173 
174     }
175     //絵を描く
176     drawScreen();
177 }
178 
179 //設定倍率
180 function upSize() {
181     var scale = 1;
182     if (asc) {
183         if (scaleY > 3 && scaleY < 4) {
184             scale = 4 - scaleY;
185         }
186         scaleX += scaleXY * scale;
187         scaleY += scale;
188     }
189     if (desc) {
190         if (scaleY > 1 && scaleY < 2) {
191             scale = scaleY - 1;
192         }
193         scaleX -= scaleXY * scale;
194         scaleY -= scale;
195     }
196     setShowWH();
197 }
198 
199 //ジェスチャーを設置する。
200 function setGesture() {
201     var gesture = new MSGesture();
202     gesture.target = c;
203 
204     //ジェスチャーの変更事件
205     c.addEventListener("MSGestureChange", handlegesture);
206     //ジェスチャーのネ~わる事件
207     c.addEventListener("MSGestureEnd", handlegestureEnd);
208 
209     //クリックジェスチャー
210     c.addEventListener("MSPointerDown", function (evt) {
211         writeEventLog("pinch-in", "ピンチインイベント");
212         clearTimeout(timeFn);
213 
214         gesture.addPointer(evt.pointerId);
215         if (pointerX1 == 0 && pointerY1 == 0) {
216             pointerX1 = evt.pageX - canvasPosition.x;
217             pointerY1 = evt.pageY - canvasPosition.y;
218         }
219 
220         else if (pointerX2 == 0 && pointerY2 == 0) {
221             pointerX2 = evt.pageX - canvasPosition.x;
222             pointerY2 = evt.pageY - canvasPosition.y;
223         }
224         preX = evt.pageX - canvasPosition.x;
225         preY = evt.pageY - canvasPosition.y;
226 
227     });
228 
229     //ジェスチャーの変更する処理。
230     function handlegesture(e) {
231         arv_address.arv_node = "";
232         arv_address.arv_hyper = "";
233         arv_address.arv_num = "";
234         $("#ekiPanel").animate({ opacity: "hide" }, 50);
235         isGesture = true;
236         if (e.scale > 1) {
237             zoomInAndOutMap(true);
238         }
239         else if (e.scale < 1) {
240             zoomInAndOutMap(false);
241         } else {
242 
243             //イメージポイントを取得する
244             var imgX = (imgW * preX) / (windowWidth * scaleX) + imgOffsetX;
245             var imgY = (imgH * preY) / (windowHeight * scaleY) + imgOffsetY;
246             setZoom(imgX, imgY, e.offsetX, e.offsetY);
247             preX = e.offsetX;
248             preY = e.offsetY;
249         }
250     }
251 
252     //ジェスチャーの終わる処理。
253     function handlegestureEnd(e) {
254         writeEventLog("pinch-out", "ピンチアウトイベント");
255         pointerX1 = 0;
256         pointerY1 = 0;
257         pointerX2 = 0;
258         pointerY2 = 0;
259         isGesture = false;
260     }
261 }
262 //表示する倍率を設置する。
263 function setScale(isUp) {
264     if (isUp) {
265         if (scaleY < 4) {
266             scaleX += scaleXY * 0.05;
267             scaleY += 0.05;
268         }
269     } else {
270         if (scaleY > 1) {
271             scaleX -= scaleXY * 0.05;
272             scaleY -= 0.05;
273         }
274     }
275     if (scaleY < 1) {
276         scaleY = 1;
277         scaleX = scaleXY;
278     }
279     if (scaleY > 4) {
280         scaleY = 4;
281         scaleX = scaleXY * 4;
282     }
283 }
284 
285 //地図のズーミングは操作します。
286 function zoomInAndOutMap(isUp) {
287     var x = Math.abs(pointerX1 - pointerX2) / 2;
288     var y = Math.abs(pointerY1 - pointerY2) / 2;
289     if (pointerX1 <= pointerX2) {
290         x = x + pointerX1;
291     } else {
292         x = x + pointerX2;
293     }
294     if (pointerY1 <= pointerY2) {
295         y = y + pointerY1;
296     } else {
297         y = y + pointerY2;
298     }
299     //img point
300     g_x = ((imgW / scaleX) * (x / windowWidth)) + imgOffsetX;
301     g_y = ((imgH / scaleY) * (y / windowHeight)) + imgOffsetY;
302 
303     setScale(isUp);
304     setZoom(g_x, g_y, x, y);
305 }
306 
307 //地図を移動する。
308 function moveMap(x, y) {
309     if (imgOffsetX >= 0) {
310         imgOffsetX += x;
311     }
312     if (imgOffsetY >= 0) {
313         imgOffsetY += y;
314     }
315     if (imgShowW + imgOffsetX > imgW) {
316         imgOffsetX = imgW - imgShowW;
317     }
318     if (imgShowH + imgOffsetY > imgH) {
319         imgOffsetY = imgH - imgShowH;
320     }
321     if (imgOffsetX < 0) {
322         imgOffsetX = 0;
323     }
324     if (imgOffsetY < 0) {
325         imgOffsetY = 0;
326     }
327     //絵を描く
328     drawScreen();
329 }
330 
331 //絵を描く
332 function drawScreen() {
333     if (imgShowW > 0 && imgShowH > 0 && imgOffsetX >= 0 && imgOffsetY >= 0) {
334         cxt.fillRect(0, 0, windowWidth, windowHeight);
335         if (scaleY <= 1) {
336             asc = true;
337             desc = false;
338         }
339         if (scaleY >= 4) {
340             asc = false;
341             desc = true;
342         }
343         if (scaleY >= 1) {
344             cxt.drawImage(img, imgOffsetX, imgOffsetY, imgShowW, imgShowH,
345              0, 0, windowWidth, windowHeight);
346         }
347         else {
348             cxt.drawImage(img, imgOffsetX, imgOffsetY, imgShowW, imgShowH,
349              0, 0, windowWidth * scaleX, windowHeight * scaleY);
350         }
351     }
352 }