﻿//Global Variables
METERS_PER_DEGREE = 109801.71;
PIXELS_PER_METER=3779.52438465144;
EARTH_RADIUS=6378137; 
IMPORTED_CLASSES=new Array();
IMG_SERVER='http://mapdb.365ditu.cn/';
//IMG_SERVER='http://211.147.248.42/';
JS_SERVER='http://map.api.365ditu.net/rmap1_0/';
XML_SERVER='';
DEBUG_REQUIRED=true;
SVG_URL="http://www.w3.org/2000/svg";


//向当前文档中导入一个js类
function importClass(className){
	for(var iClass=0;iClass<IMPORTED_CLASSES.length;iClass++){
		if(IMPORTED_CLASSES[iClass].toLowerCase()==className.toLowerCase()){
			return;
		}
	}
	IMPORTED_CLASSES[IMPORTED_CLASSES.length]=className;
	var path='';
	var paths=className.split(".");
	for(var iPath=0;iPath<paths.length;iPath++){
		path+='/'+paths[iPath];
	}
	document.write('<script language="javascript" src="'+JS_SERVER+path+'.js"></script>');
} 

//为一个DOM对象的事件附加方法
function addEvent(element,evts,func){
    if (element.addEventListener){
         element.addEventListener(evts.replace('on',''),func, false);          
    } else if (element.attachEvent){
         element.attachEvent(evts, func);
    } 
}
//移除一个DOM对象事件上附加的方法
function removeEvent(element,evts,func){
    if (element.removeEventListener){
         element.removeEventListener(evts.replace('on',''),func, false);          
    } else if (element.attachEvent){
         element.detachEvent(evts, func);
    } 
}

function getBoundingClientRect(element){   
    if(element){
        var bounds=new Object();
        if(!document.addEventListener){
            bounds=element.getBoundingClientRect();
        }else{
            bounds.left=element.offsetLeft;
            bounds.top=element.offsetTop;
            bounds.right=element.offsetLeft+element.offsetWidth;
            bounds.bottom=element.offsetTop+element.offsetHeight;            
        }
        return bounds;
    }else{
        return null;
    }    
}
function firefoxGetBoundingClientRect(element){
    if(element){
        var bounds=null;
        if(!document.addEventListener){
            
            bounds=element.getBoundingClientRect();
        }else{
            bounds=new Object();
            bounds.left=element.x;
            bounds.top=element.y;
            bounds.right=element.x+element.offsetWidth;
            bounds.bottom=element.y+element.offsetHeight;
        }
        return bounds;
    }else{return null;}    
}
//长度，面积计算相关
importClass('rapi.rbase.RCoordinate');
function getPathDistance(latlngs){
	var distances=0;
	for(var pointCursor=0;pointCursor<latlngs.length-1;pointCursor++){
		distances+=distanceBetween(latlngs[pointCursor],latlngs[pointCursor+1]);
	} 
	return distances;
}
function distanceBetween(pointa,pointb){
	return EARTH_RADIUS*Math.acos(Math.cos(pointa.lng*Math.PI/180-pointb.lng*Math.PI/180)*Math.cos(pointa.lat*Math.PI/180)*Math.cos(pointb.lat*Math.PI/180)+Math.sin(pointa.lat*Math.PI/180)*Math.sin(pointb.lat*Math.PI/180));
}

function getPolygonArea(latlngs){ 
    var area = 0;
    var coordinate;
    for(var iLatLng=0; iLatLng < latlngs.length-1; iLatLng++)
    {
        var lastIndex = iLatLng + 1;
        coordinate = new RCoordinate();
        coordinate.fromLatLng(latlngs[iLatLng], '');
        var x1 = coordinate.getX();
        var y1 = coordinate.getY();
        coordinate = new RCoordinate();
        coordinate.fromLatLng(latlngs[lastIndex], '');
        var x2 = coordinate.getX();
        var y2 = coordinate.getY();
        var tmp = ( x1 * y2 - y1 * x2  );
        area += tmp;
    }
    area = Math.abs( area ) * 0.5;
    return area;
}

function degreeFromDistance(distance){
	return Math.round(distance/METERS_PER_DEGREE*100000)/100000;
}

////////////////////////////
//操作cookie相关
function getCookie(name){
	var mycookie=document.cookie;
	var start1=mycookie.indexOf(name+'=');
	var value=null;
	if(start1==-1){
		return null;
	}else{
		var start=mycookie.indexOf('=',start1)+1;
		var end=mycookie.indexOf(';',start);
		if(end==-1){
			end=mycookie.length;
		} 
		value=unescape(mycookie.substring(start,end)); 
	} 
	return value;
}
function setCookie(name,value,expireseconds){
    var cookieString = name+'='+escape(value)+';';
	var expireDate=new Date();
	if(expireseconds){
		expireDate.setTime(expireDate.getTime()+expireseconds*86400000);//8640000一天的毫秒数
//		expireDate.setTime(expireDate.getTime()+expireseconds*1000);//8640000一天的毫秒数
        cookieString += 'expires='+expireDate.toGMTString()+';';
	}
	cookieString += 'domain=365ditu.com';
    document.cookie = cookieString;
}
function delCookie(name){ 
	var value=getCookie(name);
	if(value){
		var expireDate=new Date();
		expireDate.setTime(expireDate.getTime()-1);
		document.cookie=name+'='+value+';expires='+expireDate.toGMTString();
	}
}
////////////////
function setRTimeout(target,func,delay,args){
	if(args){
		if(target){
			window.setTimeout(function(){func.apply(target,args);},delay);
		}
	}else{
		if(target){
			window.setTimeout(function(){func.apply(target);},delay);
		}
	}
}
function getInnerText(str){
	var div=new RDiv().get();
	div.innerHTML=str;
	if(!div.addEventListener){
	    return div.innerText;
	}else{
	    return div.textContent;
	}
}
function innerText(element){
    if(window.event){
        return element.innerText;
    }else{
        return element.textContent;
    }
}
//解析参数
function getQueryString(para)
{
	var retval="";
	var s=location.search.replace("?","");
	if(s=="")return "";s = s.split("&");
	for(var i=0;i<s.length;i++)
	if(s[i].toUpperCase().indexOf(para.toUpperCase() + "=")==0)
	retval+=((retval==""?"":", ")+s[i].substr(s[i].indexOf("=")+1,s[i].length));
	return retval;
}
function getHashString(para)
{
	var retval="";
	var s=location.hash.replace("#","");
	if(s=="")return "";s = s.split("&");
	for(var i=0;i<s.length;i++)
	if(s[i].toUpperCase().indexOf(para.toUpperCase() + "=")==0)
	retval+=((retval==""?"":", ")+s[i].substr(s[i].indexOf("=")+1,s[i].length));
	return retval;
}

//编码解码
function rituEncoding(lat,lng){
	var originLng = 72;
	var originLat = 0 ;
	var grid10w = 72 ;
	var grid10h = 72 ;
	var grid9w = 24 ;
	var grid9h = 24 ;
	var code='';
	var d1=0;
	var d2=0;
	var offsetLng=(lng-originLng)*METERS_PER_DEGREE;
	var offsetLat=(lat-originLat)*METERS_PER_DEGREE;
	for(var i=4;i>=0;i--){
		code=code+Math.floor(offsetLng/(grid10w*Math.pow(10,i)))+Math.floor(offsetLat/(grid10h*Math.pow(10,i)));
		d1=(offsetLng/(grid10w*Math.pow(10,i)))-Math.floor(offsetLng/(grid10w*Math.pow(10,i)));
		offsetLng=d1*(grid10w*Math.pow(10,i));
		
		d2=(offsetLat/(grid10h*Math.pow(10,i)))-Math.floor(offsetLat/(grid10h*Math.pow(10,i)));
		offsetLat=d2*(grid10h*Math.pow(10,i));
	} 
	code=code+((Math.floor(offsetLng/grid9w)+1)+(Math.floor(offsetLat/grid9h)*3));
	return code;
}

function rituDecoding(code){
	if(code.length!=11){
		return null;
	}
	var originLng = 72;
	var originLat = 0 ;
	var grid10w = 72 ;
	var grid10h = 72 ;
	var grid9w = 24 ;
	var grid9h = 24 ;
	var lat=null;
	var lng=null;
	var n=null;
	offsetLng=parseInt(code.charAt(0),10)*grid10w*Math.pow(10,4)+parseInt(code.charAt(2),10)*grid10w*Math.pow(10,3)+parseInt(code.charAt(4),10)*grid10w*Math.pow(10,2)+parseInt(code.charAt(6),10)*grid10w*10+parseInt(code.charAt(8),10)*grid10w;
	offsetLat=parseInt(code.charAt(1),10)*grid10h*Math.pow(10,4)+parseInt(code.charAt(3),10)*grid10h*Math.pow(10,3)+parseInt(code.charAt(5),10)*grid10h*Math.pow(10,2)+parseInt(code.charAt(7),10)*grid10h*10+parseInt(code.charAt(9),10)*grid10h;
	if(parseInt(code.charAt(10))==0){
		offsetLat=offsetLat+(grid10h/2);
		offsetLng=offsetLng+(grid10w/2);
	} else{
		if((parseInt(code.charAt(10))-3)/3<=0){
			n=0;
		}else if((parseInt(code.charAt(10),10)-3)/3<=1&&(parseInt(code.charAt(10),10)-3)/3>0){
			n=1;
		} else if((parseInt(code.charAt(10),10)-3)/3<=3&&(parseInt(code.charAt(10),10)-3)/3>1){
			n=2;
		} 
		offsetLat=offsetLat+grid9h*(n+1)-grid9h/2;
		offsetLng=offsetLng+(parseInt(code.charAt(10),10)-3*n)*grid9w-grid9w/2;
	} 
	lng=(offsetLng/METERS_PER_DEGREE)+originLng;
	lat=(offsetLat/METERS_PER_DEGREE)+originLat;
	
	return new RLatLng(lat,lng);
}

//检验是否RITUCODE
function isValidRituCode(code)
{
	if(!code)
	{return false;}
	if(!code.length)
	{return false;}
	if(code.length==11)
	{
		var  rtcodeRegex;
		rtcodeRegex=/^\d{11}$/;
		return rtcodeRegex.test(code);
	}
	return false;
}
//去掉字符窜的空格
function trim(str){
	return str.replace(/[ ]/g,"").replace(/[　]/g,"");  
}
String.prototype.trim = function(){// 用正则表达式将前后空格，用空字符串替代。
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

function decoding(code){
	var strLicenseKey=596;
	var midindex=-1;
	var midchar=0;
	var tmpstring='';		
	//为该字符串的每一个字符循环IJIBVBWUABJGJ 13位
	for(var i=0;i<code.length;i++){
		var tmpchar=parseInt(code.charAt(i),36)-10;
		if(tmpchar>=10){tmpchar=tmpchar-7;}
		tmpstring+=(tmpchar).toString(36);
		if(tmpchar>midchar){
			midindex=i;
			midchar=tmpchar;
		}
	}
	var leftstring=parseInt(tmpstring.substring(0,midindex),16);
	var rightstring=parseInt(tmpstring.substring(midindex+1),16);
	var latlng=new Array();
	latlng[0]=(leftstring+rightstring-parseInt(strLicenseKey))/2;
	latlng[1]=(rightstring-latlng[0])/100000.0;
	latlng[0]/=100000.0;
	return new RLatLng(latlng[1],latlng[0]);
}

//对经纬度编码
function codeLatLng(lat,lng)
{
    if(lat < 0 || lat > 90 || lng < 0 || lng > 180)
    {
        return null;
    }
    else
    {
        var latlng = '';
        lat = getFloat(lat,6,'lat');
        lng = getFloat(lng,6,'lng');
        
        latlng = lat+lng;
        return latlng;
    }
}


//对经纬度解码
function enCodeLatLng(latlng)
{
    if(latlng == '' || latlng == null)
    {
        objNull = new Object();
        objNull.lat = null;
        objNull.lng = null;
        return objNull;        
    }
    else
    {
        var lat = '';
        var lng = '';
        
        latlng = latlng + '';
        latlng = latlng.replace(/[ ]/g,"");
        
        lat = latlng.substr(0,2) + '.' + latlng.substr(2,6);
        lng = latlng.substr(8,3) + '.' + latlng.substr(11,6);
        
        obj = new Object();
        obj.lat = parseFloat(lat);
        obj.lng = parseFloat(lng);
        
        return obj;
    }
    
}
//判断是否为经纬度编码
function isValidLatLngCode(code){
    if(!code){return false;}
    if(code.length==17){
        var  rtcodeRegex;
		rtcodeRegex=/^\d{17}$/;
		if(!rtcodeRegex.test(code)){return false;};		
        return true;
    }
    return false;    
}

//保留float型参数value小数点后len位
function getFloat( value, len, type)
{
    var str = value.toString();
    var i = parseInt( len );
    var index = str.indexOf( "." );
    
    var temp1='';
    temp1 = str.substr( 0, index) ;
    if(type == 'lat')
    {
        while(temp1.length < 2)
        {
            temp1 = '0'+ temp1;
        }
    }
    if(type == 'lng')
    {
        while(temp1.length < 3)
        {
            temp1 = '0'+ temp1;
        }
    }

    var temp2 = '';
    temp2 =  str.substr( (index+1), 6) ;
    while(temp2.length<6)
    {
        temp2 += '0';
    }
    return (temp1+temp2);

}