///////////////////////////////////
//////////////////////////////////
// All rights reserved to Amadot(ZBN) Ltd. (c) 
// Google Maps handling version 2.0
// input marker parser/builder 
// last update -  12/12/11
/////////////////////////////////
MAPS.Parse = {};

////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////  AJAX  //////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
MAPS.sendAjax = function(data, handler, token, isSync)
{
	var headers = new Ajax.Headers();
	headers.add("Content-Type", "text/javascript");
	
	// creating object
	var type = isSync ? Ajax.typeEnum.SYNC : Ajax.typeEnum.ASYNC;
	var ajax = new Ajax.Request(MAPS.ajaxUrl, Ajax.methodEnum.POST, type, headers);
	// adding handler
	ajax.incomingResponseEvent.addHandler_obj(handler);
	// registering another with another event to dispose the object
	ajax.incomingResponseEvent.addHandler(MAPS.afterAjaxWasSent);
	
	// sending request
	ajax.send(data, token);
}
MAPS.sendUpdateAjax = function(data, isSync)
{
	MAPS.sendAjax(data, new EVENTS.Handler(MAPS.Parse.updateQuery_ResponseHandler), null, isSync);	
}
MAPS.afterAjaxWasSent = function(response)
{
	response.request.dispose();	
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////  AJAX  //////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
MAPS.startJsonArray = function(action)
{
	var data = new Array();
	data["action"] = action;
	data["city"] = City.name;
	return data;
}
MAPS.toJson = function(arr)
{
	var s = new Array();
	s.push("{");
	var isFirst = true;
	for(var i in arr)
	{
		if (!isFirst) s.push(',');
		isFirst = false;
		
		s.push('\"');
		s.push(i);
		s.push('\":');
		if (typeof(arr[i]) === 'object')
		{
			s.push(MAPS.toJson(arr[i]));
		}
		else
		{
			s.push('\"');
			s.push(arr[i]);
			s.push('\"');
		}
	}
	s.push("}");
	return s.join('');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////  RATING  //////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
MAPS.Parse.emptyStar = "images/empty_star.gif";
MAPS.Parse.fullStar = "images/full_star.gif";
MAPS.Parse.buildRating = function(rating)
{
	var str = '';
	for (var i=1;i<6;i++)
	{
		if (i<=rating)
			str+= "<img src='"+MAPS.Parse.fullStar+"'>";
		else
			str+= "<img src='"+MAPS.Parse.emptyStar+"'>";
	}	
	return str;
}


////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////  AIDING  //////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
MAPS.Parse.trim = function(word)
{
	return (word.replace(/^\s+|\s+$/, ''));	
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////// DB  //////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
MAPS.Parse.loadMarker = function(json)
{
	//  manipulating poly
	var poly = json["p"];
	if (poly && poly != 'NULL') MAPS.Overlays.Polygon.deserialize(poly);
	
	var point = new google.maps.LatLng(json["la"],json["lg"]);
	
	////////// manipulating days ////
	var days = MAPS.Parse.decodeDays(parseInt(json["d"]));
	
	// creating object
	new MAPS.Markers.markerObj(point
		,json["ndx"]
		,MAPS.Parse.decodeFromJson(json, "t")
		,MAPS.Parse.decodeFromJson(json, "c")
		,MAPS.Parse.decodeFromJson(json, "n")
		,MAPS.Parse.decodeFromJson(json, "url")
		,MAPS.Parse.decodeFromJson(json, "a1")
		,MAPS.Parse.decodeFromJson(json, "a2")
		,MAPS.Parse.decodeFromJson(json, "ph")
		,MAPS.Parse.decodeFromJson(json, "op")
		,parseInt(json["r"])
		,MAPS.Parse.decodeFromJson(json, "rs")
		,json["nLa"], json["nLg"], days, json["i"]);
}

MAPS.Parse.updateQuery_ResponseHandler = function(response)
{
	if (!response.json || !response.json.amadot.data) alert(response.text);
}
MAPS.Parse.insertNewMarkerQuery_ResponseHandler = function(response)
{
	if (!response.json || !response.json.amadot.data)
	{
		alert(response.text);
		return;
	}
	// saving marker id
	response.token.tag.dbId = response.json.amadot.data;
}


//inserts the new marker to the DB
MAPS.Parse.insertToDb = function(markerObj,what2do)
{
	if (what2do == '' || what2do == null)
	{
		alert("no what2do");
		return;	
	}
	
	var data = MAPS.startJsonArray("updateMarker");
	data["data"] = new Array();
	
	var handler = null;
	var token = null;
	if (what2do == 'insert')
	{
		data["data"]["action"] = "insert";
		
		// adding the point attributes
		data["data"]["la"] = markerObj.lat;
		data["data"]["lg"] = markerObj.lng;
		
		handler = new EVENTS.Handler(MAPS.Parse.insertNewMarkerQuery_ResponseHandler);
		token = new Ajax.Token(
		{
			tag: markerObj
		});
	}
	else
	{
		data["data"]["action"] = "update";
		
		handler = new EVENTS.Handler(MAPS.Parse.updateQuery_ResponseHandler);
	}
	
	// adding polygon
	data["data"]["ndx"] = markerObj.dbId;
	if (markerObj.polygon) data["data"]["p"] = MAPS.Overlays.Polygon.serialize(markerObj.polygon);
	
	// adding other values
	MAPS.Parse.encodeToJson(data["data"], "t", markerObj.type);
	MAPS.Parse.encodeToJson(data["data"], "c", markerObj.comment);
	MAPS.Parse.encodeToJson(data["data"], "n", markerObj.name);
	MAPS.Parse.encodeToJson(data["data"], "url", markerObj.markUrl);
	MAPS.Parse.encodeToJson(data["data"], "a1", markerObj.address1);
	MAPS.Parse.encodeToJson(data["data"], "a2", markerObj.address2);
	MAPS.Parse.encodeToJson(data["data"], "ph", markerObj.telephone);
	MAPS.Parse.encodeToJson(data["data"], "op", markerObj.openings);
	MAPS.Parse.encodeToJson(data["data"], "rs", markerObj.ratingSource);
	data["data"]["r"] = markerObj.rating;
	data["data"]["d"] = MAPS.Parse.encodeDays(markerObj);
	data["data"]["i"] = markerObj.importance;
	
	MAPS.sendAjax(MAPS.toJson(data), handler, token);
}

MAPS.Parse.deleteFromDb = function(posInArr)
{
	var data = MAPS.startJsonArray("deleteMarker");
	data["data"] = new Array();
	data["data"]["index"] = MAPS.Markers.arr[posInArr].dbId;
	
	MAPS.sendUpdateAjax(MAPS.toJson(data));
}
MAPS.Parse.updateLocation = function(ndx,point)
{
	var data = MAPS.startJsonArray("updateLocation");
	data["data"] = new Array();
	data["data"]["index"] = ndx;
	data["data"]["lat"] = point.lat();
	data["data"]["lng"] = point.lng();
	MAPS.sendUpdateAjax(MAPS.toJson(data));
}

MAPS.Parse.changeMarkerName = function(ndx,newName)
{
	var data = MAPS.startJsonArray("changeName");
	data["data"] = new Array();
	data["data"]["index"] = ndx;
	MAPS.Parse.encodeToJson(data["data"], "name", newName);	
	MAPS.sendUpdateAjax(MAPS.toJson(data));
}

MAPS.Parse.insertTab = function(markerObj, tabObject)
{
	var data = MAPS.startJsonArray("insertTab");
	data["data"] = new Array();
	data["data"]["markerNdx"] = markerObj.dbId;
	MAPS.Parse.encodeToJson(data["data"], "name", tabObject.title);
	MAPS.Parse.encodeToJson(data["data"], "content", tabObject.content);
	
	handler = new EVENTS.Handler(MAPS.Parse.insertTab_ResponseHandler);
	token = new Ajax.Token(
	{
		tag: tabObject
	});
	MAPS.sendAjax(MAPS.toJson(data), handler, token, true);
}
MAPS.Parse.insertTab_ResponseHandler = function(response)
{
	if (!response.json || !response.json.amadot.data)
	{
		alert(response.text);
		return;
	}
	
	// saving tab id
	response.token.tag.index = response.json.amadot.data;
}

MAPS.Parse.updateTab = function(tabObject)
{
	var data = MAPS.startJsonArray("updateTab");
	data["data"] = new Array();
	data["data"]["ndx"] = tabObject.index;
	MAPS.Parse.encodeToJson(data["data"], "content", tabObject.content);
	MAPS.Parse.encodeToJson(data["data"], "name", tabObject.title);	
	MAPS.sendUpdateAjax(MAPS.toJson(data), true);
}
MAPS.Parse.deleteTab = function(tabObject)
{
	var data = MAPS.startJsonArray("deleteTab");
	data["data"] = new Array();
	data["data"]["ndx"] = tabObject.index;
	MAPS.sendUpdateAjax(MAPS.toJson(data), true);
}

MAPS.Parse.getTabs = function(markerNum,ndx)
{
	var data = MAPS.startJsonArray("getTabs");
	data["data"] = new Array();
	data["data"]["markerNdx"] = ndx;
	
	var token = new Ajax.Token(
	{
		id: markerNum	
	});
	MAPS.sendAjax(MAPS.toJson(data), new EVENTS.Handler(MAPS.Parse.getTabsHandler), token, true);
}
MAPS.Parse.getTabsHandler = function(response)
{
	if (!response.json || !response.json.amadot.data)
	{
		alert(response.text);
		return;	
	}

	var markerNum = response.token.id;
	var marker = MAPS.Markers.arr[markerNum];
	var jsonData = response.json.amadot.data;
	var tabData;
	for(var i=0;i<jsonData.length;++i)
	{
		tabData = jsonData[i];
		new MAPS.Markers.tab(marker, tabData["ndx"]
			, MAPS.Parse.decodeFromJson(tabData, "name")
			, MAPS.Parse.decodeFromJson(tabData, "content"));
	}
	MAPS.Markers.generateBigHTML(marker);
}
MAPS.Parse.updateNumberMarkers = function(numStr,latStr, lngStr)
{
	var data = MAPS.startJsonArray("updateNumberMarkers");
	data["data"] = new Array();
	data["data"]["ids"] = numStr;
	data["data"]["lat"] = latStr;
	data["data"]["lng"] = lngStr;
	MAPS.sendUpdateAjax(MAPS.toJson(data));
}
MAPS.Parse.decodeDays = function(jsonDays)
{
	return {
		sun : (jsonDays >> 6) & 1,
		mon : (jsonDays >> 5) & 1,	
		tue : (jsonDays >> 4) & 1,
		wed : (jsonDays >> 3) & 1,
		thr : (jsonDays >> 2) & 1,
		fri : (jsonDays >> 1) & 1,
		sat : jsonDays & 1,
	}
}
MAPS.Parse.encodeDays = function(markerObj)
{
	var days = markerObj.sun;
	days = days << 1;
	days += markerObj.mon;
	days = days << 1;
	days += markerObj.tue;
	days = days << 1;
	days += markerObj.wed;
	days = days << 1;
	days += markerObj.thr;
	days = days << 1;
	days += markerObj.fri;
	days = days << 1;
	days += markerObj.sat;
	return days;
}

MAPS.Parse.decodeFromJson = function(json, ndx)
{
	return General.Base64.decodeString(json[ndx]);
}
MAPS.Parse.encodeToJson = function(json, ndx, value)
{
	json[ndx] = General.Base64.encodeString(value);
}

