//
// Timepicker -- a javascript time picker.
//
// $Id: TimePicker.js,v 1.0 05/10/2006 13:25:33 TC02463 Exp $
//
//
// Author: Tomcy John (tc02463@emirates.com)
//
// Design borrowed from dojo TimePicker component
//
// Thanks to:
//     Sunanda Kariyakarawana [sunanda.k@emirates.com] for making me understand good javascripts
//                                                     and providing me support throughout the development...:)
//     Alok Kumar Roy [TC02457@emirates.com] for initially javascript help...:)
//
function TimePicker(compName, time, format, timeType, interval, hourInterval, separator,_disable_Img){
    this._separator = separator;
    this._hourInterval = hourInterval;
    this._compName = compName;
    this._format = format;
    this._timeType = timeType;
    this._currentTime = time;
    this._interval = parseFloat(interval);
    this._HOUR = 'Hour';
    this._MINUTE = 'Minute';
    this._SECOND = 'Second';
    this._AMPM = 'AMPM';
    var arrTime = new Array();
    if(time)
        arrTime = this.finalDate(time);
    this._finalHour = arrTime[0];
    this._finalMinute = arrTime[1];
    this._finalSecond = arrTime[2];
    this._finalAMPM = arrTime[3];
    this._calDiv;
    this._bw = new bw_check();
    this._HourArr = new Array();
    this._MinuteArr = new Array();
    this._SecondArr = new Array();
    this._AMPMArr = new Array();
    this._disable_Img=_disable_Img;
}

TimePicker.prototype.getTimeArray = function(time){
    var finalArr = new Array();
    var hourIndex = this._format.indexOf("HH");
    if(hourIndex == -1)
        hourIndex = this._format.indexOf("hh");
    var minIndex = this._format.indexOf("mm");
    var secIndex = this._format.indexOf("ss");

    var arr = time.split(this._separator);
    switch(hourIndex){
        case 0: finalArr[0] = arr[0];
            break;
        case 3: finalArr[0] = arr[1];
            break;
        case 6: finalArr[0] = arr[2];
            break;
    }
    if(finalArr[0])
        if(finalArr[0].indexOf("AM") != -1 || finalArr[0].indexOf("PM") != -1)
            finalArr[0] = finalArr[0].substring(0, 2);
    switch(minIndex){
        case 0: finalArr[1] = arr[0];
            break;
        case 3: finalArr[1] = arr[1];
            break;
        case 6: finalArr[1] = arr[2];
            break;
    }
    if(finalArr[1])
        if(finalArr[1].indexOf("AM") != -1 || finalArr[1].indexOf("PM") != -1)
            finalArr[1] = finalArr[1].substring(0, 2);
    switch(secIndex){
        case 0: finalArr[2] = arr[0];
            break;
        case 3: finalArr[2] = arr[1];
            break;
        case 6: finalArr[2] = arr[2];
            break;
    }
    if(finalArr[2])
        if(finalArr[2].indexOf("AM") != -1 || finalArr[2].indexOf("PM") != -1)
            finalArr[2] = finalArr[0].substr(0, 2);

    if(time){
        if(time.indexOf("AM") != -1)
            finalArr[3] = "AM";
        else if(time.indexOf("PM") != -1)
            finalArr[3] = "PM";
    }
    return finalArr;
}

TimePicker.prototype.finalDate = function(time){
    var arr = this.getTimeArray(time);
    var newDate = new Date();
    if(this._timeType == '12'){
        if(arr[3] == 'PM')
            if(arr[0])
                arr[0] = parseFloat(arr[0])+12;
    }
    if(parseFloat(arr[0]) == 24)
        arr[0] = 0;
    var hour = parseFloat(arr[0])>=0?parseFloat(arr[0]):00;
    var min = parseFloat(arr[1])>=0?parseFloat(arr[1]):00;
    var sec = parseFloat(arr[2])>=0?parseFloat(arr[2]):00;
    var dateVar = new Date(newDate.getYear(), newDate.getMonth(), newDate.getDay(), hour, min, sec);
    return this.currentClientTime(dateVar);
}

TimePicker.prototype.onchange = function() {};

TimePicker.prototype.toggle = function(element,calPos) {
	try{
		/*if(!eval(element.name+"_calprecall(element)")){
			return;
		}*/
		if(element){
			if(element.disabledTimePicker){
				return;
			}
			if(this._disable_Img=='true'){
				return;
			}
		}
	}catch(e){};
    if(this._showing) {
		this.hide();
	} else {
		this.show(element,calPos);
	}
}

TimePicker.prototype.hide = function() {
	if(this._showing) {
		this._calDiv.style.display = "none";
		this._showing = false;
		if( this._bw.ie6 ) {
		    if( this._underDiv ) this._underDiv.removeNode(true);
		}
	}
}

TimePicker.prototype.setCurrentClientTime = function() {
    var arrTime = this.currentClientTime();
    this._finalHour = arrTime[0];
    this._finalMinute = arrTime[1];
    this._finalSecond = arrTime[2];
    this._finalAMPM = arrTime[3];
}

TimePicker.prototype.show = function(element,calPos) {
    if(!this._showing) {
        var time = element.value;
        if(time){
            var arrTime = this.finalDate(time);
            this._finalHour = arrTime[0];
            this._finalMinute = arrTime[1];
            this._finalSecond = arrTime[2];
            this._finalAMPM = arrTime[3];
        }else{
            this.setCurrentClientTime();
        }
        this.updateTimePicker(true);
		var p;
		if(calPos)
			p = calPos;
		else
			p = getPoint(element);
		this._calDiv.style.display = "block";
		this._calDiv.style.top = (p.y + element.offsetHeight + 1) + "px";
		this._calDiv.style.left = p.x + "px";
		this._showing = true;

		/* -------- */
	   	if( this._bw.ie6 )
	   	{
	     	dw = this._calDiv.offsetWidth;
	     	dh = this._calDiv.offsetHeight;
	     	var els = document.getElementsByTagName("body");
	     	var body = els[0];
	     	if( !body ) return;

	    	//paste iframe under the modal
		     var underDiv = this._calDiv.cloneNode(false);
		     underDiv.style.zIndex="390";
		     underDiv.style.margin = "0px";
		     underDiv.style.padding = "0px";
		     underDiv.style.display = "block";
		     underDiv.style.width = dw;
		     underDiv.style.height = dh;
		     underDiv.style.border = "0px solid WindowText";
		     underDiv.innerHTML = "<iframe width=\"100%\" height=\"100%\" frameborder=\"0\"></iframe>";
		     body.appendChild(underDiv);
		     this._underDiv = underDiv;
	   }
		/* -------- */
		try{
			this._calDiv.focus();
		}
		catch(ex){}
	}
};

TimePicker.prototype.create = function(){
    var hourCheck = (this._format.indexOf('HH') != -1||this._format.indexOf('hh') != -1);
	var minCheck = (this._format.indexOf('mm') != -1);
	var secCheck = (this._format.indexOf('ss') != -1);
	var colspan = 0;
	if(hourCheck) colspan = colspan+1;
	if(minCheck) colspan = colspan+1;
	if(secCheck) colspan = colspan+1;
	if(this._timeType == 12) colspan = colspan+1;
    var dp = this;
	var newDiv = createDiv("timeDiv"+this._compName);//document.createElement("div");
	newDiv.style.position = "absolute";
	newDiv.style.display = "none";
	newDiv.style.border = "1px solid #CCCCCC";//"1px solid WindowText";
	newDiv.style.textAlign = "center";
	newDiv.style.background = "White";//"Window";
	newDiv.style.zIndex = "400";

	var outerTable = createTable(null,null,"0","1","0");
	var tbody = document.createElement("tbody");
	outerTable.appendChild(tbody);
	this._table = outerTable;
    //Header TR section - Start
	var headerTr = createTr(null,"paneltableheader",null,"18px");
	tbody.appendChild(headerTr);
    var headerTd1 = createTd(null,null,null,null,'left', null, (colspan > 2?colspan-1:null));
	headerTd1.appendChild(document.createTextNode("Time Picker"));
	headerTr.appendChild(headerTd1);
	var headerTd2 = createTd(null,null,null,null,'right');
	headerTr.appendChild(headerTd2);
	var hdrCloseImg = createImage(null,'images/ico_close.gif',"0",null,null);
	var link = createLink("","","", "Close Time Picker","");
	link.appendChild(hdrCloseImg);
	link.onclick = function(){dp.toggle();};
	headerTd2.appendChild(link);
	tbody.appendChild(headerTr);
    //Header TR section - End

    //Main Content Header- Start
	var outerTr = createTr();
	tbody.appendChild(outerTr);
	if(hourCheck){
    	var outerTd1 = createTd();
    	outerTd1.appendChild(document.createTextNode("Hour"));
    	outerTr.appendChild(outerTd1);
    }
	if(minCheck){
    	var outerTd2 = createTd();
    	outerTd2.appendChild(document.createTextNode("Minute"));
    	outerTr.appendChild(outerTd2);
    }
	if(secCheck){
    	var outerTd3 = createTd();
    	outerTd3.appendChild(document.createTextNode("Second"));
    	outerTr.appendChild(outerTd3);
    }
    if(this._timeType == '12'){
    	var outerTd4 = createTd();
    	outerTd4.appendChild(document.createTextNode(" "));
    	outerTr.appendChild(outerTd4);
    }
	tbody.appendChild(outerTr);
    //Main Content Header- End

    //Button section - Start
	var outerTr2 = createTr();
	tbody.appendChild(outerTr2);
	if(hourCheck){
    	var outerTd21 = createTd();
    	var sHourTable = this.createTimeTable(this._HOUR);
    	outerTd21.appendChild(sHourTable);
    	outerTr2.appendChild(outerTd21);
    }
    if(minCheck){
    	var outerTd22 = createTd();
    	var sMinuteTable = this.createTimeTable(this._MINUTE);
    	outerTd22.appendChild(sMinuteTable);
    	outerTr2.appendChild(outerTd22);
    }
    if(secCheck){
    	var outerTd23 = createTd();
    	var sSecondTable = this.createTimeTable(this._SECOND);
    	outerTd23.appendChild(sSecondTable);
    	outerTr2.appendChild(outerTd23);
    }
    if(this._timeType == '12'){
    	var outerTd24 = createTd();
        var sAMPM = this.createAMPMTable();
    	outerTd24.appendChild(sAMPM);
    	outerTr2.appendChild(outerTd24);
    }
    tbody.appendChild(outerTr2);
    //Button section - End

	var outerTr3 = createTr();
	var outerTd31 = createTd(null,null,null,null,null,null,4);
    var tblButton1 = createButton(null,"input","Current Time");
    outerTd31.appendChild(tblButton1);
    outerTd31.appendChild(document.createTextNode(" "));
	var tblButton2 = createButton(null,"input","Clear",null);
    outerTd31.appendChild(tblButton2);
	this._setButton = tblButton1;
	this._clearButton = tblButton2;
	outerTr3.appendChild(outerTd31);
	tbody.appendChild(outerTr3);

	newDiv.appendChild(outerTable);

    this._table.onclick = function (e) {
		// find event
		if (e == null) e = document.parentWindow.event;

		// find td
		var el = e.target != null ? e.target : e.srcElement;
		while (el.nodeType != 1)
			el = el.parentNode;
		while (el != null && el.tagName && el.tagName.toLowerCase() != "td")
			el = el.parentNode;

		// if no td found, return
		if (el == null || el.tagName == null || el.tagName.toLowerCase() != "td")
			return;

		var n = el;
		dp.checkBg(n);
		dp.setFinalValue(n);
	};
    this._setButton.onclick = function(){
        dp.setCurrentClientTime();
        dp.setSelectedTime(true);
    };
    this._clearButton.onclick = function(){
        dp.clearSelectedTime();
    };
    this._calDiv = newDiv;
    document.body.appendChild(newDiv);
}

TimePicker.prototype.setSelectedTime = function(close) {
	this._selectedTime = this.formatTime();
	if (typeof this.onchange == "function") {
		this.onchange();
	}
	if(close)
	    this.hide();
}

TimePicker.prototype.formatTime = function() {
	if (this._selectedTime == null) {
		return "";
	}
	var finalString = '';
	var hourCheck = (this._format.indexOf('HH') != -1||this._format.indexOf('hh') != -1);
	if(hourCheck)
	    finalString = finalString+(this._finalHour != null?this._finalHour:"00");
	var minCheck = (this._format.indexOf('mm') != -1);
	if(minCheck)
	    finalString = (finalString != ""?finalString+this._separator:finalString)+(this._finalMinute != null?this._finalMinute:"00");
	if(this._format.indexOf('ss') != -1)
	    finalString = (finalString != ""?finalString+this._separator:finalString)+(this._finalSecond != null?this._finalSecond:"00");
    if(this._timeType == '12' && finalString != "")
        finalString = finalString+(this._finalAMPM != null?" "+this._finalAMPM:"");
    this._selectedTime = finalString;
    return this._selectedTime;
}

TimePicker.prototype.setFinalValue = function(obj){
	var objId = obj.id;
	var arr = objId.split(':');
	var identifier = arr[0];
	var val = arr[1];
	if(identifier == this._HOUR){
		this._finalHour = val;
	}else if(identifier == this._MINUTE){
		this._finalMinute = val;
	}else if(identifier == this._SECOND){
		this._finalSecond = val;
	}else if(identifier == this._AMPM){
		this._finalAMPM = val;
	}
    if(objId)
        if(objId.indexOf(this._compName) != -1)
            this.setSelectedTime(false);
}

TimePicker.prototype.createAMPMTable = function(){
    var tbl = createTable(null,null,0,0,0);
	var tblTr;
	var tblTd;
	var tblLink;
	var tbody = document.createElement("tbody");
	tbl.appendChild(tbody);

    tblTr = createTr();
	tblTd = createTd("AMPM:AM"+":"+this._compName);
	var textNode = document.createTextNode("AM")
    tblTd.appendChild(textNode);
    setCursor(tblTd);
    tblTr.appendChild(tblTd);
    this._AMPMArr[0] = textNode;

    tblTd = createTd("AMPM:PM"+":"+this._compName);
    setCursor(tblTd);
    textNode = document.createTextNode("PM")
    tblTd.appendChild(textNode);
    tblTr.appendChild(tblTd);
    this._AMPMArr[1] = textNode;
    tbody.appendChild(tblTr);
    return tbl;
}

TimePicker.prototype.createTimeTable = function(identifier){
    var interval = parseFloat(this._interval);
    var timeType;
	var isHour = false;;
	var isMinute = false;
	var isSecond = false;
	if(identifier == 'Hour'){
		isHour = true;
		interval = parseFloat(this._hourInterval);
		timeType = parseFloat(this._timeType);
	}else if(identifier == 'Minute'){
		isMinute = true;
		timeType = 60;
	}else if(identifier == 'Second'){
		isSecond = true;
		timeType = 60;
	}
	var hourArr = new Array();
	var parts = parseFloat(timeType/interval);
	for(i=0;i < parts;i++){
		m = i;
		if(isHour && timeType != 24)
			m +=1;
		val = m*interval;
		if(val < 10)
			val = "0"+val;
		hourArr[i] = val;
	}
	rows = 6;
	cols = hourArr.length/rows;
	var tbl = createTable(null,null,0,0,0);
	var tblTr;
	var tblLink;
	var tbody = document.createElement("tbody");
	tbl.appendChild(tbody);
	for(j=0;j<rows;j++){
		tblTr = createTr();
		for(k=0;k<cols;k++){
			try{
			    var textNode;
			    var val;
			    var tblTd;
				if(k==0){
				    val = parseFloat(hourArr[j]);
                    tblTd = createTd(identifier+":"+hourArr[j]+":"+this._compName);
                    setCursor(tblTd);
                    textNode = document.createTextNode(hourArr[j]);
                    tblTd.appendChild(textNode);
				}else{
				    val = parseFloat(hourArr[(j+k*(rows))]);
				    tblTd = createTd(identifier+":"+hourArr[(j+k*(rows))]+":"+this._compName);
				    setCursor(tblTd);
				    textNode = document.createTextNode(hourArr[(j+k*(rows))]);
                    tblTd.appendChild(textNode);
				}
				switch(identifier){
				    case this._HOUR:
				        this._HourArr[val] = textNode;
				        break;
				    case this._MINUTE:
				        this._MinuteArr[val] = textNode;
				        break;
				    case this._SECOND:
				        this._SecondArr[val] = textNode;
				        break;
				}
				tblTr.appendChild(tblTd);
			}catch(e){}
		}
		tbody.appendChild(tblTr);
	}
	return tbl;
}

TimePicker.prototype.checkBg = function(obj){
	// find table
	var tbl = obj;
	while (tbl.nodeType != 1)
		tbl = tbl.parentNode;
	while (tbl != null && tbl.tagName && tbl.tagName.toLowerCase() != "table")
		tbl = tbl.parentNode;

	// if no table found, return
	if (tbl == null || tbl.tagName == null || tbl.tagName.toLowerCase() != "table")
		return;
    if (tbl.hasChildNodes()){
        var tbodyList = tbl.childNodes;
        for(k = 0; k < tbodyList.length;k++){
            var tbody =  tbodyList[k];
            if (tbody.hasChildNodes()){
                var trList = tbody.childNodes;
                for(i = 0; i < trList.length;i++){
                    var tblTr =  trList[i];
                    if (tblTr.hasChildNodes()){
                        var tdList = tblTr.childNodes;
                        for(j = 0; j < tdList.length;j++){
                            var tblTd =  tdList[j];
                            tblTd.style.border='';
                        }
                    }
                }
            }
        }
    }
    if(obj){
        if(obj.id)
            if(obj.id.indexOf(this._compName) != -1)
	            obj.style.border='1px solid black';
	}
}

TimePicker.prototype.clearSelectedTime = function() {
	this._selectedTime = null;
	if (typeof this.onchange == "function") {
		this.onchange();
	}
}

TimePicker.prototype.currentClientTime = function(date) {
    var clientDate = new Date();
    if(date)
        clientDate = date;
    var arr = new Array();
    var hour = clientDate.getHours();
    var minutes = clientDate.getMinutes();
    var seconds = clientDate.getSeconds();

    arr[0] = hour;
    arr[3] = '';
    if(this._timeType == '12'){
        if(hour > 12){
            arr[0] = hour - 12;
            arr[3] = 'PM';
        }else
            arr[3] = 'AM';
        if(arr[0] == 0){
            arr[0] = 12;
            arr[3] = 'AM';
        }
    }
    arr[1] = (minutes - (minutes%this._interval));
    arr[2] = (seconds - (seconds%this._interval));
    for(i = 0; i < 3;i++){
        var str = "00"+arr[i];
        arr[i] = str.substr(str.length-2);
    }
    return arr;
}

TimePicker.prototype.updateTimePicker = function(selDeselect) {
    if(this._finalHour){
        var hour = this._HourArr[parseFloat(this._finalHour)];
        if(hour){
            this.checkBg(hour.parentNode);
        }
    }
    if(this._finalMinute){
        var minute = this._MinuteArr[parseFloat(this._finalMinute)];
        if(minute){
            this.checkBg(minute.parentNode);
        }
    }
    if(this._finalSecond){
        var second = this._SecondArr[parseFloat(this._finalSecond)];
        if(second){
            this.checkBg(second.parentNode);
        }
    }
    if(this._finalAMPM){
        var ampm = this._AMPMArr[(this._finalAMPM == 'AM')?0:1];
        if(ampm){
            this.checkBg(ampm.parentNode);
        }
    }
}

function setCursorForTime(obj) {
   if (navigator.appName == "Microsoft Internet Explorer") {
        obj.style.cursor = "hand";
    } else {  // is mozilla/netscape
        obj.style.cursor = "pointer";
    }
}
