
// create my slider
function mySlider(name,minmaxLabels,initLevel){
    var self=new GLargeMapControl();
    self.getRelativeZoomSliderPos=function(p){
	if(p==null){
	    p=self.map.zoomLevel;
	}else{
	    if(p<0){
		p=0;
	    }else if(p>=self.map.spec.numZoomLevels){
		p=self.map.spec.numZoomLevels-1 
	    }
	}
	return 1+p*self.sliderNotchHeight;
    };
    // a is dummy map object
    self.initialize=function(a){
	self.map=a;
	var b=a.ownerDocument.createElement("div");
	b.className="slider";
//	var divisor=self.map.spec.numZoomLevels>=18?18:11;
// 	if(self.map.spec.numZoomLevels>divisor){
// 	    self.sliderNotchHeight /= (self.map.spec.numZoomLevels/divisor);
// 	}
	self.createZoomSlider(a,b,self.map.spec.numZoomLevels);
	// override the default trigger name
	var zp=GEvent.getPropertyName("zoom") ;
	a[GEvent.getPropertyName(name+"Zoom")]=a[zp];
	a[zp]=null;
	// creates an image and a div under b.  want to move them up, back
	// becuse I am not creating pan controls for just a slider
	var slidiv=b.childNodes[0];
	if(slidiv){
	    //var np = new coord(0, Element.getTop(slidiv));
	    var np = Element.getCoord(slidiv);
	    var kids=b.childNodes;
	    for( var i=0;i<kids.length;i++){
		var pos = Element.getCoord(kids[i]);
		pos.x -= np.x;
		pos.y -= np.y;
		pos.apply(kids[i]);
	    }
	}
	var offsetY=Element.getTop(b.lastChild)-5;
	var min=a.ownerDocument.createElement("div");
	min.className="sliderTickLabel";
	min.appendChild(a.ownerDocument.createTextNode(minmaxLabels[0]));
	var labpos=new coord(21,offsetY+self.getRelativeZoomSliderPos(0));
	labpos.apply(min);
	b.appendChild(min);
	var max=a.ownerDocument.createElement("div");
	max.className="sliderTickLabel";
	max.appendChild(a.ownerDocument.createTextNode(minmaxLabels[1]));
	labpos=new coord(21,offsetY+self.getRelativeZoomSliderPos(10000));
	labpos.apply(max);
	b.appendChild(max);
	var title=a.ownerDocument.createElement("div");
	title.className="sliderTitle";
	title.appendChild(a.ownerDocument.createTextNode(name));
	// labpos=new coord(0,0);
	// labpos.apply(title);
	b.appendChild(title);
	return b;
    };
    return self;
};


function timeSliders(){}

timeSliders.prototype={
    // initialize with an element e, and a date to keep in sync, d
    timeValues:{'years':[2000,2001,2002,2003,2004,2005],
		'months':[0,1,2,3,4,5,6,7,8,9,10,11],
		'days':[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],
		'hours':[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23],
		'minutes':[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59]
    },

// following code in prototype::Object
    observeDate:function(observer){
	this.stopObservingDate(observer);
	this.observers.push(observer);
    },
    stopObservingDate: function(observer) {
	for(var i=0;i<this.observers.length;i++){
	    if(this.observers[i]==observer){
		this.observers.splice(i,1);
		return;
	    }
	}
    },

    fireDateListeners:function(){
	for (var i = 0; i < this.observers.length; i++) {
	    this.observers[i](this.syncDate);
	}
    },
    unloadCache:function(){
	if (!this.observers){ return; }
	for (var i = 0; i < this.observers.length; i++) {
	    this.observers[i][0] = null;
	}
	this.observers = false;
    },
    // to do in this function: check to make sure that new date is
    // indeed a valid date, that is, that I don't go setting February
    // 31 or something inane like that.
    adjustDate:function(oldlevel,newlevel,name){
	var value;
	// okay, implementing overcounting, rollover minutes, seconds, etc.
	// so newlevel can be -1, or length, rather than between 0,length-1
	if(newlevel==-1){
	    // set current to max value, set next over decrementing one
	    value=this.timeValues[name][this.timeValues[name].length-1];
	    newlevel="decrementLeft";
	}else if(newlevel==this.timeValues[name].length){
	    value=this.timeValues[name][0];
	    newlevel="incrementLeft";
	} else {
	    value=this.timeValues[name][newlevel];
	}
	//if(_debug){_debug.log("adjusting date from "+ this.syncDate +" to  "+name+"="+value);}
	var element;
	var priorElement;
	for(var i=0; i<this.elements.length;i++){
	    if(this.elements[i].id==name){
		element=this.elements[i];
		if(i>0){
		    priorElement=this.elements[i-1];
		}
		//if(_debug){_debug.log("element is "+i+" "+element.id);}
		break;
	    }
	    //if(_debug){_debug.log("no match");}
	}
	if(newlevel=="decrementLeft" ||
	   newlevel=="incrementLeft" ||
	   this.syncDate[element.getDateCall]()!=value){
	    if(priorElement && newlevel=="decrementLeft"){
		//decrement the prior element
		//if(_debug){_debug.log("decrementing, old date is "+this.syncDate);}
		this.syncDate[priorElement.setDateCall](this.syncDate[priorElement.getDateCall]() - 1);
		this.syncDate[element.setDateCall](value);
		//if(_debug){_debug.log("decrementing, new date is "+this.syncDate);}
	    }else if(priorElement && newlevel=="incrementLeft"){ 
		//increment the prior element
		//if(_debug){_debug.log("incrementing, old date is "+this.syncDate);}
		this.syncDate[priorElement.setDateCall](this.syncDate[priorElement.getDateCall]() + 1);
		this.syncDate[element.setDateCall](value);
		//if(_debug){_debug.log("incrementing, new date is "+this.syncDate);}
	    }else{
		this.syncDate[element.setDateCall](value);
	    }
	    if(self.timerId!=null){
		self.minuteTracker();
	    }
	    this.fireDateListeners();
	}else{
	    //if(_debug){_debug.log("no change, date is "+this.syncDate);}
	}	    
    },	
    setCurrentDate:function(d,t){
	//if(_debug){_debug.log("setting current date to "+d);}

	// set the date sliders based on the passed date
	this.syncDate=d;
	// call all of the sliders to set the appropriate value
	// do it by setting "map.zoomLevel" to the desired value
	// for each of the stored dummy maps
	// and firing the correct action
	// which means just call my overridden zoomTo function, eh?
	for(var i=0; i<this.elements.length;i++){
	    // fetch aspect of date
	    var dateval=d[this.elements[i].getDateCall]();
	    var datelevel=0;
	    while(this.timeValues[this.elements[i].id][datelevel] != dateval && datelevel<this.timeValues[this.elements[i].id].length){
		datelevel++;
	    }
	    
	    this.elements[i].dm.zoomTo(datelevel);
	}
	if(t){this.fireDateListeners();}
    },
	
    // the element, the initial date, and the date change function to call with changed date
    initialize:function(e,d){

	this.element=$(e);
	this.ownerDocument=this.element.ownerDocument||document;
	this.syncDate=d;
	this.observers=[];
	this.timerId=null;

	var self=this;
	var controls=["years","months","days","hours","minutes"];
	var dateCalls=["getFullYear","getMonth","getDate","getHours","getMinutes"];
	var dateSets=["setFullYear","setMonth","setDate","setHours","setMinutes"];
	var levels=[6,12,31,24,60];
	var limits=[[2000,2005],[1,12],[1,31],[0,23],[0,59]];
	var elements=[];

	for(var i=0;i<controls.length;i++){
	    var elem;
	    elem=$(controls[i]);
	    if(elem==null){
		elem=this.ownerDocument.createElement("div");
		elem.id=controls[i];
	    }
	    var dm;
		
	    dm=new DummyMap(elem,levels[i],controls[i]);
		

	    dm.addControl(new mySlider(controls[i],limits[i]));
	    
	    GEvent.addListener(dm,controls[i]+"Zoom",this.adjustDate.bind(this));


		elements.push({id:controls[i],
				  getDateCall:dateCalls[i],
				  setDateCall:dateSets[i],
				  element:elem,
				  dm:dm}
			  );
	}


	this.elements=elements;
	this.setCurrentDate(d);
	
	this.addMinuteTracker=function(){
	    if(_debug){_debug.log("adding Minute Tracker button");}
	    // click to track current date
	    var track=self.ownerDocument.createElement("div");
	    track.className="sliderTrackButton";
	    var button=self.ownerDocument.createElement("a");
	    
	    button.appendChild(self.ownerDocument.createTextNode("update every minute"));
	    button.href="javascript:void(0)";
	    self.minuteTracker=function(){
		if(button.pressed==true){
		    button.pressed=false;
		    button.className="";
		    if(self.timerId!=null){
			clearInterval(self.timerId);
		    }
		    self.timerId=null;
		}else{
		    button.pressed=true;
		    button.className="pressed";
		    self.setCurrentDate(new Date(),true);
		    if(self.timerId!=null){
			clearInterval(self.timerId);
		    }
		    self.timerId=setInterval((function() {self.setCurrentDate(new Date(),true)}).bind(self), 60* 1000);
		}
	    }
	    button.onclick=self.minuteTracker.bind(self);
	    track.appendChild(button);
	    if(_debug){_debug.log("appending element track to self.element");}
	    self.element.appendChild(track);
	};



    }

};
    
    // did it work?

