// reset these in vm temploate
var _SID; 
var _dtBaseUrl="../action";
var _dtInitialAction="/submitdetectorrequestjson";
var _dtFileFetchAction="/fetchdetectorresponsejson";
// options can be     
// options['sid']  curent session id, should be automatic
// options['stationId'] the station id
// options['numLanes'] the number of lanes
// options['stationName'] the station name
// and more! totally undocumented thrills!
function detectorQuery(options){
    if(_debug)_debug.log("hi from generic detector");
    var self=this;
    this.ownerDocument=options.map.ownerDocument;
    var baseUrl=_dtBaseUrl;
    // action contains the base parameters for the site in question
    var action=_dtInitialAction;
    var sid=options.sid;
    if(!sid){return null;}
    var stationId=options.stationId;
    var numLanes=options.numLanes;

    this.labelName=options.hwyName+" at "+options.stationName;
    // positioning of this detector
    this.lat=options.point.y;
    this.lon=options.point.x;
    this.UTM=null;
    if(options.UTM !=null){
	this.UTM=options.UTM;
    }

    var generalOptions = "";
    generalOptions += FormValue("state","California");
    generalOptions += FormValue("district",(options.district || "D12"));
    generalOptions += FormValue("hwyName",options.hwyName);
    generalOptions += FormValue("stationName",options.stationName);
    generalOptions += FormValue("stationID",options.stationId);
    generalOptions += FormValue("numofLanes",options.numLanes);


    var lanesOptions="";
    for (var i = 1; i <= numLanes; i++) {
	lanesOptions += FormValue("enable"+i,"on");
	var offsetVal=0;
	if(options.offset && options.offset.length && options.offset.length>i){
	    offsetVal=options.offset[i];
	}
	lanesOptions += FormValue("offset"+i,"0");
    }

    var staticOptions=FormValue("count","on")+
	FormValue("occ","on")+
	FormValue("speed","on")+
	FormValue("class","on")+
	FormValue("SID",sid);

    this.baseFilename="_"+options.stationId;
    this.computedFilename=null;

    this.baseUrl=baseUrl;
    this.url=baseUrl+action;

    this.getOptions=function(end,start){
	var interval=this.setInterval(end,start);
	start=interval.start;
	end=interval.end;
	// form final filename
	self.computedFilename=self.baseFilename+self.stamp(end,start,interval.current);
	var fileOption=FormValue("filename",self.computedFilename);
	return generalOptions+lanesOptions+this.getTimeOptions(end,start)+staticOptions+fileOption;
    };
    return this;
}
detectorQuery.prototype.stamp=function(d1,d2,current){
    if(d1==null || d2==null){
	var interval =this.setInterval(d1,d2);
	d1=interval.end;
	d2=interval.start,
	current=interval.current;
    }
    if(current){
	return "current";
    }else{
	return d2.getTime()+"_"+d1.getTime();
    }
};  
detectorQuery.prototype.defaultTimeInterval=1;
detectorQuery.prototype.defaultAggrInterval=1;
detectorQuery.prototype.setInterval=function(d1,d2){
    var interval={};
    if( d1==null){
	interval.end=new Date();
	interval.current=true;
    }else{
	interval.end=d1;
    }
    if(d2==null){
	var millisecond=d1.getTime( );
	var prior=millisecond - this.defaultTimeInterval*60000;
	interval.start=new Date( prior);
    }else{
	interval.start=d2;
    }
    return interval;
};
detectorQuery.prototype.getTimeOptions=function(end,start){
    if(start==null || end==null){
	var interval=this.setInterval(end,start);
	start=interval.start;
	end=interval.end;
    }
    var month=start.getMonth() + 1;
    var day=start.getDate();
    var year= 1900 + start.getYear();
    var hour=twoDigits(start.getHours());
    var minute=twoDigits(start.getMinutes());
    
    var timeOptions=FormValue("aggregate",this.defaultAggrInterval);
    timeOptions+=FormValue("minStart",minute);
    timeOptions+=FormValue("hourStart",hour);
    timeOptions+=FormValue("dayStart",day);
    timeOptions+=FormValue("monthStart",month);
    timeOptions+=FormValue("yearStart",year);

    month=end.getMonth() + 1;
    day=end.getDate();
    year=1900+end.getYear();
    hour=twoDigits(end.getHours());
    minute=twoDigits(end.getMinutes());
    
    timeOptions+=
    FormValue("minEnd",minute) +
    FormValue("hourEnd",hour) +
    FormValue("dayEnd",day)+
    FormValue("monthEnd",month)+
    FormValue("yearEnd",year);
    return timeOptions;
};

detectorQuery.prototype.detectorHTML=function(lane,count,occ,speed){
    var li0=this.ownerDocument.createElement("li");
    var ul1=this.ownerDocument.createElement("ul");
    ul1.className="laneData";
    var li1=this.ownerDocument.createElement("li");
    li1.appendChild(this.ownerDocument.createTextNode("lane="+lane));
    ul1.appendChild(li1);
    li1=this.ownerDocument.createElement("li");
    li1.appendChild(this.ownerDocument.createTextNode("cnt="+count));
    ul1.appendChild(li1);
    li1=this.ownerDocument.createElement("li");
    li1.appendChild(this.ownerDocument.createTextNode("occ="+occ));
    ul1.appendChild(li1);
    li1=this.ownerDocument.createElement("li");
    li1.appendChild(this.ownerDocument.createTextNode("spd="+speed));
    ul1.appendChild(li1);
    li0.appendChild(ul1);
    return li0;
}
    
detectorQuery.prototype.parseDetectorResponse=function(req){
    if(_debug){_debug.log("entering parseDetectorResponse with req="+req);}
    var response={};
    var jsonText=req.responseText;
    var statusText=req.statusText;
    if(_debug){_debug.log("jsontext is "+jsonText+", status text is "+statusText);}
    
    // have to scrape response from document
    // example string
//  Date   Time(PT) Lane Count  %Occ  Speed Class0 Class1 Class2 Class3 Class4 Class5 Class6 Class7 Class8 Class9 Class10 Class11 Class12 Class13 Class14 Exceptions
//07-14-05 15:04:00   1    11    0.0  74.81     0      0      0      9      2      0      0      0      0      0      0       0       0       0       0       0

    // separate parsing here from html formulation later

    var dateRegex = new RegExp("Exceptions\\s*(\\d+-\\d+-\\d+\\s+\\d\\d:\\d\\d:\\d\\d)");
    var dateStrings=jsonText.match(dateRegex);
    response.dateString='';
    if(dateStrings){
	response.dateString=dateStrings[1];
    }
    var missingRegex = new RegExp("missing (\\d+) vehicle");
    var missingStrings=jsonText.match(missingRegex);
    response.missingString='0';
    if(missingStrings){
	response.missingString=missingStrings[1];
    }
    var dataRegex = new RegExp(':\\d\\d\\s+(\\d+\\s+\\d+\\s+\\d+\\.\\d+\\s+\\d+\\.\\d+)',"g");
    var dataMatch=jsonText.match(dataRegex);
    if(_debug){_debug.log("match is "+ dataMatch);}

    // now iterate over the lines
    var lines=[];
    dataRegex =  new RegExp(':\\d\\d\\s+(\\d+)\\s+(\\d)+\\s+(\\d+\\.\\d)+\\s+(\\d+\\.\\d+)',"");
    for(var i=0;i<dataMatch.length;i++){
	var lineMatch=dataMatch[i].match(dataRegex);
	//if(_debug){_debug.log("match is "+ lineMatch);}
	lines.push(lineMatch);
    }
    response.lines=lines;

    return response;
};

detectorQuery.prototype.detectorDataParseAndHTML=function(req){
    if(_debug){_debug.log("entering detectorDataParseAndHTML with req="+ req);}
    var parsed=this.parseDetectorResponse(req);
    
    var box=new boxSize(225,20); // default size, make longer if
    // extra elements, shorter if
    // not
    var moreText=new boxSize(0,10); // add 10 px per line
    // move through known data and put in order
    // forming relevant strings at each step
    
    var ulD=this.ownerDocument.createElement("ul");
    ulD.className="segmentData";
    var title=this.ownerDocument.createElement("li");
    title.appendChild(this.ownerDocument.createTextNode(parsed.dateString));
    ulD.appendChild(title);
    box.grow(moreText);

    title=this.ownerDocument.createElement("li");
    title.appendChild(this.ownerDocument.createTextNode(this.labelName));
    ulD.appendChild(title);
    box.grow(moreText);

    title=this.ownerDocument.createElement("li");
    title.appendChild(this.ownerDocument.createTextNode("missed "+parsed.missingString +" vehicles"));
    ulD.appendChild(title);
    box.grow(moreText);

    // now iterate over the lines
    for(var i=0;i<parsed.lines.length;i++){
	var lineMatch=parsed.lines[i];
	ulD.appendChild(this.detectorHTML(lineMatch[1],
					  lineMatch[2],
					  lineMatch[3],
					  lineMatch[4]));
	box.grow(moreText);
    }
    ulD.className="popUp";
    box.setEm(12);
    var pos=new coord(0,0);
    pos.apply(ulD);
    box.apply(ulD);
    return {ul:ulD, 
	    box:box ,
	    lon:this.lon,
	    lat:this.lat
	    };
};

detectorQuery.prototype.IFWClass=function(req,mapCanvas,mapObject) {
    var ifw = new infoWindow(req,mapCanvas,mapObject,this.detectorDataParseAndHTML.bind(this));
    return ifw;
};


var detectorSites=[];
function createDetectorSite(container,map,commondate,options){

    var canvas=map.div;
    var dst=new detectorSite(Object.extend(options,
					   {formGenerator:detectorQuery,
						   dateslider:commondate,
						   container:container,
						   map:map,
						   sid:_SID
						   }
					   ));
    if(_debug){_debug.log("created detector site");}
    var dotElement= new infoMarker(options.point,
				   options.map.div,
				   options.map,
				   options.dotImage);
    dotElement.show();
    // for now
    GEvent.addListener(map, "zoom",function(){dotElement.refresh();});
    GEvent.addListener(map, "maptypechanged",function(){dotElement.refresh();});
    GEvent.addListener(map, "moveend",function(){dotElement.refresh();});
    

    if(_debug){_debug.log("created dotElement");}
   
    Event.observe(dotElement.getElement(), 
		  "click", 
		  dst.openHandler,
		  true);
    detectorSites.push({site:dst,marker:dotElement});
}

var sandCanyonOptions={
    point: new decimalCoord(-117.77786390314101, 33.658021870943045),
    stationId:"86550720",
    numLanes:6,
    stationName:"Sand_Canyon",
    state:"California",
    district:"D12",
    hwyName:"I405N"
}; 
var sandCanyonOfframpOptions={
    point: new decimalCoord(-117.77509049901961, 33.656770509389695),
    stationId:"52996288",
    numLanes:1,
    stationName:"Sand_Canyon_Off_Ramp",
    state:"California",
    district:"D12",
    hwyName:"I405N"
}; 
var lagunaCanyonOptions={
    point: new decimalCoord(-117.76810200343131, 33.653156975181965),
    stationId:"36219072",
    numLanes:7,
    stationName:"Laguna_Canyon",
    state:"California",
    district:"D12",
    hwyName:"I405N",
    offset:[26.37,20.65,18.14,15.45,12.78,10.08,7.32]
}; 

     
