﻿/*
* TIMELINE, v1.0
*
* all code and designs Copyright 2009 webinicity (http://www.webinicity.com)
* 
* You may not copy, amend or use this code or design without prior 
* agreement from webinicity.
*
*/	
var oneMinute = 60 * 1000;  // milliseconds in a minute
var oneHour = oneMinute * 60;
var oneDay = oneHour * 24;
var oneWeek = oneDay * 7;

var monthNames = new Array( "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"  );
var dayNames = new Array( "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" );

var dayWidth = 20; //px
var dayHeight = 140;
var totalHeight = 0;
var top = 0;
var drawTop = -470;

var isIE6 = (navigator.appVersion.indexOf("MSIE 6.0",0) > -1);

// TIMELINE OBJECT
function TimeLine(fromDate, toDate, timelines, divId) {
    this.fromDate_ = fromDate;
    this.toDate_ = toDate;
	this.timelines_ = timelines;
	this.divId_ = divId;
	this.containerDiv_ = document.getElementById(divId);
	this.divWidth_ = document.getElementById(divId).style.width;
	this.divHeight_ = document.getElementById(divId).style.height;
	this.divTop_ = document.getElementById(divId).style.top;
	this.divLeft_ = document.getElementById(divId).style.left;

	//drawTop = -1 * ((this.divHeight_.replace("px","")) - 79);
	dayHeight = (((this.divHeight_.replace("px","")) - 40)/this.timelines_.length);
	//dm("divH " + this.divHeight_ + " dayHeight " + dayHeight + "   tLen " + this.timelines_.length);
	totalHeight = ((this.divHeight_.replace("px","")) - 40);
	//alert(drawTop);


    for (var i = 0; i < this.timelines_.length; i++) {
        for (var j = 0; j < this.timelines_[i].events.length; j++) {
            this.timelines_[i].events[j].fromDateYMD = getYMD(this.timelines_[i].events[j].fromDate); 
            this.timelines_[i].events[j].toDateYMD = getYMD(this.timelines_[i].events[j].toDate); 
        }
    }
}

TimeLine.prototype.getIForKey = function(key) {
alert("not working with multiple timelines!");
    for (var i = 0; i < this.data_.length; i++) {
        if (this.data_[i].key == key) {
            return i;
        }
    }
}

TimeLine.prototype.getData = function(key) {
    for (var i = 0; i < this.timelines_.length; i++) {
        for (var j = 0; j < this.timelines_[i].events.length; j++) {
            if (this.timelines_[i].events[j].key == key) {
                return this.timelines_[i].events[j];
            }
        }
    }
}


TimeLine.prototype.deleteData = function(key) {
    var label = "";
    var currentTimeline = 0;
    var currentDataItem = 0;
    for (var i = 0; i < this.timelines_.length; i++) {
        for (var j = 0; j < this.timelines_[i].events.length; j++) {
            if (this.timelines_[i].events[j].key == key) {
                currentTimeline = i;
                currentDataItem = j;
                label = this.timelines_[currentTimeline].label;
            }
        }
    }

    
    var aT = document.getElementById(label+"table:"+currentDataItem);
    var oldItem = aT.wy.timeLine.timelines_[currentTimeline].events[currentDataItem];
    var data = aT.wy.timeLine.timelines_[currentTimeline].events;
    data.splice(currentDataItem,1);
    dm("item [" + oldItem.text + "] removed");
    var timelineContainer = document.getElementById(label+"timelineContainer");
    var c = document.getElementById(label+"c"+currentDataItem);
    timelineContainer.removeChild(c);
    
//    c.style.visibility = "hidden";
    this.redraw_();
    return oldItem;
}

TimeLine.prototype.addData = function(timeLine, newFromDate) {
    //dm("adding to "+ timeLine.label + "   date " + newFromDate);
    var newToDate = new Date(getYMD(newFromDate).getTime()+oneDay);
    var data = { key:0, text:"new", fromDate:newFromDate, toDate:newToDate }
    timeLine.events.push(data);
    this.redraw_();
    return data;
}

TimeLine.prototype.updateData = function(newData) {
    var tdDiv = document.getElementById(newData.wy.label+""+newData.i);
    tdDiv.innerHTML = newData.text;
    for (property in newData) {
        newData.wy.data_[property] = newData[property];
    }
}


TimeLine.prototype.getValues = function() {

    var result = "";
    var comma = "";
    for (var i = 0; i <  this.timelines_.length; i++) {
        comma = "";
        result += "\n\n" + this.timelines_[i].label + " >>>> ";
        for (var j = 0; j < this.timelines_[i].events.length; j++) {
        //    result += this.data_[i].toString() + ",";
            var data_ = this.timelines_[i].events;
            result += comma+"{key:" + data_[j].key + ", text:" + data_[j].text + ", fromDate:" + formatDate(data_[j].fromDate,"MMM d, y") + ", toDate:" + formatDate(data_[j].toDate,"MMM d, y") + "}";
            comma=",";
        }
    }
    return result;
}

TimeLine.prototype.draw = function() {
	this.draw_();
}

TimeLine.prototype.draw_ = function() {
    // set up container
    var labelContainer = document.createElement("table");
    this.labelContainer = labelContainer;
    this.labelContainer.id = "mainLabelContainer";//dm(this.divTop_ + "@@ " + this.divLeft_);
    this.labelContainer.style.cssText = "overflow-x:hidden;overflow-y:hidden;border:0px solid #6B633D;border-spacing:0px;margin:0px 0px 0px 0px;padding:0px 0px 0px 0px;";
    var tbody = document.createElement("tbody");
    var tr = document.createElement("tr");
    var td = document.createElement("td");
    this.labelContainer.appendChild(tbody);
    tbody.appendChild(tr);
    tr.appendChild(td);
    var monthDiv = document.createElement("div");
    monthDiv.style.height = "40px";
    td.appendChild(monthDiv);
    for (var i = 0; i < this.timelines_.length; i++) {
        if ((i % 2) == 0) c = "#8B835D"; else c = "#9B936D";
        var timelDiv = document.createElement("div");
        timelDiv.style.cssText = "padding:4px 4px 4px 4px;background-color:"+c+"; color: white; font-family: Verdana; font-size:12px; font-weight: bold; vertical-align:middle;text-align:right;height:" + (dayHeight-7) + "px;";
//        timelDiv.style.height = dayHeight + "px";
        timelDiv.innerHTML = "<br/>"+this.timelines_[i].label;
        td.appendChild(timelDiv);

    }
    var td2 = document.createElement("td");
    
    var subContainer = document.createElement("div");
    subContainer.id = "mainContainer";//dm(this.divTop_ + "@@ " + this.divLeft_);
    subContainer.style.cssText = "position:absolute;top:" + this.divTop_ + ";left:" + this.divLeft_ + ";width:" + this.divWidth_ + ";height:" + this.divHeight_ + ";overflow-x:hidden;overflow-y:hidden;border:2px solid #6B633D;position:relative;";
    subContainer.innerHTML = "";
    subContainer.onmousedown = timelineMouseDown;
    
    
    firstMonth = true;    
    var daysHeader = this.getHeader();
    
    //top = drawTop;
    var dataTL = this.getDataTimeLines();
    //top = drawTop;
    var ol = this.getOverlaps();
    this.ol = ol;

    subContainer.appendChild(daysHeader);
    for (var i = 0; i < this.timelines_.length; i++) {
        var daysBody = this.getDaysBackground(this.timelines_[i]);
        subContainer.appendChild(daysBody);
    }
    subContainer.appendChild(ol);
    subContainer.appendChild(dataTL);

    td2.appendChild(subContainer);
    tr.appendChild(td2);


    this.containerDiv_.appendChild(this.labelContainer);

    //top = drawTop;
    //for (var i = 0; i < this.data_.length; i++) {
    this.resolveOverlaps();
    //}

    var m = document.getElementById("mainContainer");
    m.wy = {timeline:this};
    m.style.cursor = "url(images/openhand.cur),pointer";
    m.scrollLeft = fmWidth;
}

TimeLine.prototype.getMaxLevel = function(data_, i, alreadyConsidered) {
    if (!alreadyConsidered) {
        alreadyConsidered = new Array();
    }
    var maxLevel = 1;
    alreadyConsidered.push(i);
    for (var z = 0; z < data_[i].overlapArray.length; z++) {
        if (!alreadyConsidered.inArray(data_[i].overlapArray[z])) {
            var currMaxLevel = this.getMaxLevel(data_, data_[i].overlapArray[z], alreadyConsidered);
            if (currMaxLevel > maxLevel) maxLevel = currMaxLevel;
        }
    }
    if (data_[i].overlapNumber > maxLevel) maxLevel = data_[i].overlapNumber;
    return maxLevel;
}

TimeLine.prototype.setDayWidth = function(newDayWidth) {
    dayWidth = newDayWidth;

    this.redraw_();
}

TimeLine.prototype.setFromTo = function(newFromDate, newToDate) {
    this.fromDate_ = newFromDate;
    this.toDate_ = newToDate;

    for (var i = 0; i < this.timelines_.length; i++) {
        for (var j = 0; j < this.timelines_[i].events.length; j++) {
            this.timelines_[i].events[j].containerFromDate = newFromDate;
            this.timelines_[i].events[j].containerToDate = newToDate; 
        }
    }

/*    for (var i = 0; i < this.data_.length; i++) {
//        var aT = document.getElementById("table:"+this.data_[i].key);
        this.data_[i].containerFromDate = newFromDate;
        this.data_[i].containerToDate = newToDate;
    }
*/
    this.redraw_();
}

TimeLine.prototype.redraw_ = function() {

    for (var i = 0; i < this.timelines_.length; i++) {
        for (var j = 0; j < this.timelines_[i].events.length; j++) {
            this.timelines_[i].events[j].fromDateYMD = getYMD(this.timelines_[i].events[j].fromDate); 
            this.timelines_[i].events[j].toDateYMD = getYMD(this.timelines_[i].events[j].toDate); 
        }
    }
    var oldLabelContainer = this.labelContainer;

    var labelContainer = document.createElement("table");
    labelContainer = labelContainer;
    labelContainer.id = "mainLabelContainer";//dm(this.divTop_ + "@@ " + this.divLeft_);
    labelContainer.style.cssText = "overflow-x:hidden;overflow-y:hidden;border:0px solid #6B633D;border-spacing:0px;margin:0px 0px 0px 0px;padding:0px 0px 0px 0px;";
    var tbody = document.createElement("tbody");
    var tr = document.createElement("tr");
    var td = document.createElement("td");
    labelContainer.appendChild(tbody);
    tbody.appendChild(tr);
    tr.appendChild(td);
    var monthDiv = document.createElement("div");
    monthDiv.style.height = "40px";
    td.appendChild(monthDiv);
    for (var i = 0; i < this.timelines_.length; i++) {
        if ((i % 2) == 0) c = "#8B835D"; else c = "#9B936D";
        var timelDiv = document.createElement("div");
        timelDiv.style.cssText = "padding:4px 4px 4px 4px;background-color:"+c+"; color: white; font-family: Verdana; font-size:12px; font-weight: bold; vertical-align:middle;text-align:right;height:" + (dayHeight-7) + "px;";
//        timelDiv.style.height = dayHeight + "px";
        timelDiv.innerHTML = "<br/>"+this.timelines_[i].label;
        td.appendChild(timelDiv);

    }
    var td2 = document.createElement("td");
    
    var subContainer = document.createElement("div");
    subContainer.id = "mainContainer";//dm(this.divTop_ + "@@ " + this.divLeft_);
    subContainer.style.cssText = "position:absolute;top:" + this.divTop_ + ";left:" + this.divLeft_ + ";width:" + this.divWidth_ + ";height:" + this.divHeight_ + ";overflow-x:hidden;overflow-y:hidden;border:2px solid #6B633D;position:relative;";
    subContainer.innerHTML = "";
    subContainer.onmousedown = timelineMouseDown;
    
    
    firstMonth = true;    
    var daysHeader = this.getHeader();
    
    //top = drawTop;
    var dataTL = this.getDataTimeLines();
    //top = drawTop;
    var ol = this.getOverlaps();
    this.ol = ol;

    subContainer.appendChild(daysHeader);
    for (var i = 0; i < this.timelines_.length; i++) {
        var daysBody = this.getDaysBackground(this.timelines_[i]);
        subContainer.appendChild(daysBody);
    }
    subContainer.appendChild(ol);
    subContainer.appendChild(dataTL);

    td2.appendChild(subContainer);
    tr.appendChild(td2);


    this.containerDiv_.replaceChild(labelContainer, oldLabelContainer);
    this.labelContainer = labelContainer;

    //top = drawTop;
    //for (var i = 0; i < this.data_.length; i++) {
    this.resolveOverlaps();
    //}
    
    var m = document.getElementById("mainContainer");
    m.wy = {timeline:this};
    m.style.cursor = "url(images/openhand.cur),pointer";
    m.scrollLeft = fmWidth;
    
}

var firstMonth = true;
var fmWidth = 0;
TimeLine.prototype.getHeader = function() {
    // strip hours/minutes/seconds from currentDay and toDate
    var today = new Date();
    var currentDay = getYMD(this.fromDate_);//alert(currentDay);
    var toDate = getYMD(this.toDate_);//alert(this.toDate_);
    
    var table = document.createElement("table");
    table.id = "timelineHeader";
    table.style.cssText = "border:0px solid black;border-spacing:0px;border-collapse:collapse;height:40px;";
    var tableBody = document.createElement("tbody");
    table.appendChild(tableBody);
    var tr = document.createElement("tr");
    tr.id = "tableRow";
    tableBody.appendChild(tr);

    while (currentDay <= toDate) {
        var backgroundColor = "#978C59";
        if (today.getFullYear() == currentDay.getFullYear() && today.getMonth() == currentDay.getMonth()) {
            backgroundColor = "#DA8B00";
        }
        //find number of days left in current month (or till end Date) *******************  DATE FIX **************************
	var lastDayOfMonth;
	if ((currentDay.getMonth()+2) <= 12)
        	lastDayOfMonth = new Date( currentDay.getFullYear() + "/" + (currentDay.getMonth()+2) + "/1" );
	else
        	lastDayOfMonth = new Date( (currentDay.getFullYear()+1) + "/" + (currentDay.getMonth()+2-12) + "/1" );
        lastDayOfMonth = new Date(lastDayOfMonth.getTime() - oneDay);
        //alert(currentDay + ":" + lastDayOfMonth + ":" + (lastDayOfMonth.getDate() - currentDay.getDate() + 1));
        var to = "";
        if (lastDayOfMonth < this.toDate_) {
            to = lastDayOfMonth;
        }
        else {
            to = toDate;
        }
        var tdWidth = ((to.getDate() - currentDay.getDate() + 1) * dayWidth) - 1;
        
        if (firstMonth) {
            fmWidth = tdWidth;
            firstMonth = false;
        }
            
        var td = document.createElement("td");
        td.style.cssText = "background-color:"+backgroundColor+";width:"+tdWidth+"px;overflow:hidden;border-right:1px solid silver;padding:0px;";
        var tdcDiv = document.createElement("div");
        tdcDiv.style.cssText = "width:"+tdWidth+"px;position:relative;overflow:hidden;";
        var tdyDiv = document.createElement("div");
        tdyDiv.innerHTML = currentDay.getFullYear();
        tdyDiv.style.cssText = "letter-spacing:-1px;width:"+100+"px;position:relative;top:+3px;font-size:14pt;font-family:Verdana;font-weight:bold;color:#6B633D;margin-left:4px;";
        var tdmDiv = document.createElement("div");
        tdmDiv.innerHTML = monthNames[currentDay.getMonth()];
        tdmDiv.style.cssText = "letter-spacing:-1px;width:"+100+"px;position:relative;top:-1px;font:bolder 13pt verdana;color:white;margin-left:4px;margin-top:-4px;";
        tdcDiv.appendChild(tdyDiv);
        tdcDiv.appendChild(tdmDiv);
        td.appendChild(tdcDiv);
        tr.appendChild(td);      
        currentDay = new Date(lastDayOfMonth.getTime() + oneDay);
    }
//    alert(table.innerHTML);
    return table;
}

TimeLine.prototype.getDaysBackground = function(timeLine) {
    // strip hours/minutes/seconds from currentDay and toDate
    var today = new Date();
    var todayYMD = getYMD(today,"");
    var currentDay = getYMD(this.fromDate_);
    var toDate = getYMD(this.toDate_);
    
    var table = document.createElement("table");
    table.id = timeLine.label+"timelineDays";
    var wy = { timeLine: timeLine, label: timeLine.label};
    table.wy = wy;
//    table.style.cssText = "border:1px solid silver;border-spacing:0px;border-collapse:collapse;height:"+ ((this.divHeight_.replace("px",""))-50) +"px;";
    table.style.cssText = "border:1px solid silver;border-spacing:0px;border-collapse:collapse;height:"+ (dayHeight) +"px;";
    var tableBody = document.createElement("tbody");
    table.appendChild(tableBody);
    var tr = document.createElement("tr");
    tableBody.appendChild(tr);

    while (currentDay <= toDate) {
        //find number of days left in current month (or till end Date)
        var bgColor = "#978C59";
        var fgColor = "black";
        if (todayYMD.valueOf() == currentDay.valueOf()) {
            bgColor = "#DA8B00";
            fgColor = "white";
        }
        else if (currentDay.getDay() == 0 || currentDay.getDay() == 6) {
            bgColor = "#6B633D";
            fgColor = "white";
        }

        var tdWidth = dayWidth - 1;
        var td = document.createElement("td");
        td.style.cssText = "width:"+tdWidth+"px;overflow:hidden;border-right:1px solid silver;padding:0px 0px 0px 0px;background-color:"+bgColor+";vertical-align:top;";
        var tddDiv = document.createElement("div");
        tddDiv.style.cssText = "width:"+tdWidth+"px;font:normal 7pt verdana;color:"+fgColor+";line-height:90%;text-align:center;";
        tddDiv.innerHTML = dayNames[currentDay.getDay()].substr(0,3)+ "<br>"+ chopText(""+currentDay.getDate());//.toLowerCase();
        var tdcDiv = document.createElement("div");
        tdcDiv.style.cssText = "width:"+tdWidth+"px;overflow:hidden;";
        tdcDiv.appendChild(tddDiv);
        td.appendChild(tdcDiv);
        tr.appendChild(td);      
        currentDay = new Date(currentDay.getTime() + oneDay);
    }
    var opacityPercent = 75;
    table.style.opacity = opacityPercent/100;
    table.style.filter = 'alpha(opacity=' + opacityPercent + ')';

    return table;
}

TimeLine.prototype.getDataTimeLines = function() {
    // strip hours/minutes/seconds from currentDay and toDate
    var fromDate = getYMD(this.fromDate_);
    var toDate = getYMD(this.toDate_);
    var totalWidth = ((toDate.getDate() - fromDate.getDate() + 1) * dayWidth) - 1;

    var c = document.createElement("div");
    c.style.cssText = "padding:0px 0px 0px 0px;margin:0px 0px 0px 0px;border:0px solid black;position:relative;width:"+totalWidth+";height:0px;";
    c.id = "timelinesContainer";
    for (var i = 0; i <  this.timelines_.length; i++) {
        //top = ((dayHeight+14)*i) + 5;
        c.appendChild(this.getDataTimeLine(this.timelines_[i].label, this.timelines_[i].events));        
    }
    return c;
}

TimeLine.prototype.getDataTimeLine = function(label, data_) {
    // strip hours/minutes/seconds from currentDay and toDate
    var fromDate = getYMD(this.fromDate_);
    var toDate = getYMD(this.toDate_);

    var totalWidth = ((toDate.getDate() - fromDate.getDate() + 1) * dayWidth) - 1;
     
    var c = document.createElement("div");
    c.style.cssText = "padding:0px 0px 0px 0px;margin:0px 0px 0px 0px;border:0px solid black;position:absolute;width:"+totalWidth+";height:0px;";
    c.id = label+"timelineContainer";
	for (var i = 0; i < data_.length; i++) {

        //draw first td for any days between fromDate and first data_ date
        data_[i].i = i;
        var daysTo = (data_[i].fromDateYMD.getTime() - fromDate.getTime())/oneDay;
        var tdTo = (daysTo * dayWidth) - 1;
        var daysBetween = (data_[i].toDateYMD.getTime()-data_[i].fromDateYMD.getTime() + oneDay)/oneDay;
        var key = i;// this.data_[i].key;
        data_[i].containerFromDate = fromDate;
        data_[i].containerToDate = toDate;
        var wy = {i: i, data_: data_[i], timeLine: this, label: label};
        var tdWidth = (daysBetween * dayWidth) - 1;

        var aT = document.createElement("table");
        aT.id = label+"table:"+key;
        aT.wy = wy;
//        aT.i = i;
//        aT.data_ = this.data_[i];
        aT.title =  data_[i].text + ":  \n" + numberOfDaysBetween(data_[i].fromDate, data_[i].toDate) + " days from " + formatDate(data_[i].fromDate,"MMM d, y") + "   to   " + formatDate(data_[i].toDate,"MMM d, y");
//        aT.key = "table:"+key;
        aT.style.cssText = "border:0px solid black;cell-padding:0px 0px 0px 0px;cell-spacing:0px 0px 0px 0px;margin: 0px 0px 0px 0px;border-spacing:0px;border-collapse:collapse;";
        var aTB = document.createElement("tbody");
        var aTR = document.createElement("tr");
        var aTDF = document.createElement("td");
        aT.appendChild(aTB);
        aTB.appendChild(aTR);
        var tdFromDiv = document.createElement("div");
//        tdFromDiv.key = "from:"+key;
        tdFromDiv.id = label+"from:"+key;
        tdFromDiv.wy = wy;
//        tdFromDiv.i = key;
//        tdFromDiv.data_ = this.data_[i];
        tdFromDiv.style.cssText = "text-align:center;background-color:#aBa37D;color:white;cursor:w-resize;height:"+dayHeight+"px;overflow:hidden;font-size:7pt;font-family:arial;font-weight:bold;width:"+(dayWidth/2)+"px;";
        tdFromDiv.innerHTML = "&lt;";
        aTDF.appendChild(tdFromDiv);
        tdFromDiv.ondblclick = doubleClick;
        aTDF.style.cssText = "padding:0px 0px 0px 0px; margin: 0px 0px 0px 0px;";
        aTR.appendChild(aTDF);
        var tdDiv = document.createElement("div");
//        tdDiv.key = key;
        tdDiv.id = label+key;
        tdDiv.wy = wy;
//        tdDiv.i = key;
//        tdDiv.data_ = this.data_[i];
        tdDiv.style.cssText = "padding:0px 0px 0px 0px;margin:0px 0px 0px 0px;height:"+dayHeight+"px;cursor:pointer;vertical-align:middle;text-align:center;overflow:hidden;font:8pt verdana;background-color:#f7eCb9;color:black;width:"+(tdWidth - (dayWidth * 1))+"px;";
        tdDiv.innerHTML = data_[i].text;
        var aTD = document.createElement("td");
        aTD.appendChild(tdDiv);
        aTD.style.cssText = "padding:0px 0px 0px 0px; margin: 0px 0px 0px 0px;";
        aTR.appendChild(aTD);
        var tdToDiv = document.createElement("div");
//        tdToDiv.key = "to:"+key;
        tdToDiv.id = label+"to:"+key;
        tdToDiv.wy = wy;
//        tdToDiv.i = key;
//        tdToDiv.data_ = this.data_[i];
        tdToDiv.style.cssText = "text-align:center;padding:0px 0px 0px 0px;background-color:#aBa37D;color:white;cursor:e-resize;height:"+dayHeight+"px;overflow:hidden;font-size:7pt;font-family:arial;font-weight:bold;width:"+(dayWidth/2)+"px;";
        tdToDiv.innerHTML = "&gt;";
        aT.onmousedown = this.dragStart;
        aT.ondblclick = doubleClick;
        var aTDT = document.createElement("td");
        aTDT.appendChild(tdToDiv);
        tdToDiv.ondblclick = doubleClick;
        aTDT.style.cssText = "padding:0px 0px 0px 0px; margin: 0px 0px 0px 0px;";
        aTR.appendChild(aTDT);
        var tdcDiv = document.createElement("div");
//        tdcDiv.key = key;
        tdcDiv.id = label+"c"+key;
        tdcDiv.wy = wy;
//        tdcDiv.i = key;
//        tdcDiv.data_ = this.data_[i];
        tdcDiv.style.cssText = "width:"+tdWidth+"px;height:"+dayHeight+"px;border:1px solid gray;position:relative;left:"+tdTo+"px;padding:0px 0px 0px 0px;margin:0px 0px 0px 0px;overflow:hidden;height:0px;";
        tdcDiv.appendChild(aT);
        var opacityPercent = 80;
        tdcDiv.style.opacity = opacityPercent/100;
	    tdcDiv.style.filter = 'alpha(opacity=' + opacityPercent + ')';
	    c.appendChild(tdcDiv);
    }

    return c;
}
//var dmm = "";

TimeLine.prototype.getOverlaps = function() {
    // strip hours/minutes/seconds from currentDay and toDate
    var fromDate = getYMD(this.fromDate_);
    var toDate = getYMD(this.toDate_);
    var totalWidth = ((toDate.getDate() - fromDate.getDate() + 1) * dayWidth) - 1;

    var c = document.createElement("div");
    c.style.cssText = "padding:0px 0px 0px 0px;margin:0px 0px 0px 0px;border:0px solid black;position:relative;width:"+totalWidth+";height:0px;";
    c.id = "overlapsContainer";
    //top += 8;
    for (var i = 0; i <  this.timelines_.length; i++) {
        top = ((dayHeight-4)*i) - (totalHeight) + 24;// - 171;     
        c.appendChild(this.getOverlap(this.timelines_[i].label, this.timelines_[i].events));
    }
    return c;
}

TimeLine.prototype.getOverlap = function(label, data_) {
    // strip hours/minutes/seconds from currentDay and toDate
    var fromDate = getYMD(this.fromDate_);
    var toDate = getYMD(this.toDate_);
//dmm="";
    var totalWidth = ((toDate.getDate() - fromDate.getDate() + 1) * dayWidth) - 1;
       
    var c = document.createElement("div");
    c.style.cssText = "padding:0px 0px 0px 0px;margin:0px 0px 0px 0px;border:0px solid black;top:0px;position:relative;width:"+totalWidth+";height:5px;";
    c.id = label+"overlapContainer";
    var overlaps = new Array();
    var oi = 0;
    var overlapNumber = 1;
    for (var i = 0; i < data_.length; i++) {
        data_[i].overlapCount = 0; // how many items at this part in timeline?
        data_[i].overlapNumber = 0; // which item of these am I?
        data_[i].overlapArray = new Array();
    }
	for (var i = 0; i < data_.length; i++) {
        var maxOverlapNumber = 0;
        var takenNumbers = new Array();
        for (var j = 0; j< data_.length; j++) {
            if (j!=i) {
                var iFromDate = data_[i].fromDateYMD; 
                var iToDate = data_[i].toDateYMD;
                var jFromDate = data_[j].fromDateYMD;
                var jToDate = data_[j].toDateYMD;
		//alert(" f=" + jFromDate + "  t=" + jToDate + "  f2=" + iFromDate + " t2=" + iToDate + "   jFrom >= iFrom -> " + (jFromDate >= iFromDate));
                if (jFromDate >= iFromDate && jFromDate <= iToDate) {
                    //from date inside
                    if (jToDate >= iFromDate && jToDate <= iToDate) {
                        // from & to inside
                        overlaps[oi] = {from:jFromDate, to:jToDate};
                        oi++;
                        data_[i].overlapCount = data_[i].overlapCount + 1;
                        //this.data_[i].overlapArray.push(this.data_[j].key);
                        data_[i].overlapArray.push(j);
                        takenNumbers.push(data_[j].overlapNumber);
                        if (data_[j].overlapNumber > maxOverlapNumber) maxOverlapNumber = data_[j].overlapNumber;
                    }
                    else {
                        // only from inside so overlap is i+1.from - i.to
                        overlaps[oi] = {from:jFromDate, to:iToDate};
                        oi++;
                        data_[i].overlapCount = data_[i].overlapCount + 1;
                        data_[i].overlapArray.push(j);
                        takenNumbers.push(data_[j].overlapNumber);
                        if (data_[j].overlapNumber > maxOverlapNumber) maxOverlapNumber = data_[j].overlapNumber;
                    }
                }
                else {
                    if (jToDate >= iFromDate && jToDate <= iToDate) {
                        // only to date inside
                        overlaps[oi] = {from:iFromDate, to:jToDate};
                        oi++;
                        data_[i].overlapCount = data_[i].overlapCount + 1;
                        data_[i].overlapArray.push(j);
                        takenNumbers.push(data_[j].overlapNumber);
                        if (data_[j].overlapNumber > maxOverlapNumber) maxOverlapNumber = data_[j].overlapNumber;
                    }
                    else if (jFromDate < iFromDate && jToDate > iToDate) {
                        // from and to surround date
                        overlaps[oi] = {from:iFromDate, to:iToDate};
                        oi++;
                        data_[i].overlapCount = data_[i].overlapCount + 1;
                        data_[i].overlapArray.push(j);
                        takenNumbers.push(data_[j].overlapNumber);
                        if (data_[j].overlapNumber > maxOverlapNumber) maxOverlapNumber = data_[j].overlapNumber;
                    }
                }
            }
        }
        var ol = 1;
        while ( takenNumbers.inArray(ol) ) {
            ol++;
            if (ol > 100) break;
        }
        //this.data_[i].overlapNumber = maxOverlapNumber + 1;//overlapNumber++;
        data_[i].overlapNumber = ol;//overlapNumber++;

    }
    //dm(dmm);

    //var c = document.createElement("div");

    //for (var i = 0; i < this.data_.length; i++) {
    //    resolveOverlap(i);
    //}

    //top = 0;
    // draw overlaps
    for (var i = 0; i < overlaps.length; i++) {
        var daysTo = (overlaps[i].from.getTime() - getYMD(this.fromDate_).getTime())/oneDay;
        var tdTo = (daysTo * dayWidth) - 1;
        var daysBetween = (overlaps[i].to.getTime()-overlaps[i].from.getTime())/oneDay;
        var tdWidth = ((daysBetween * dayWidth) - 1 + dayWidth);
        var ol = document.createElement("div");
        ol.style.cssText = "position:absolute;top:"+top+"px;font-size:1px;";
        //top -=5;
        ol.style.width = tdWidth + "px";
        ol.style.left = tdTo + "px";
        ol.style.height = "5px";
        ol.style.backgroundColor = "#FF4040";//"red";
        var opacityPercent = 40;
        ol.style.opacity = opacityPercent/100;
	    ol.style.filter = 'alpha(opacity=' + opacityPercent + ')';
	    c.appendChild(ol);
    }
    //if (overlaps.length <= 0) top -= 10;
    return c;

}

TimeLine.prototype.resolveOverlaps = function() {
    //dm("in here!!");
    for (var i = 0; i <  this.timelines_.length; i++) {
        top = ((dayHeight+1)*i) - totalHeight + 28;// - 166;
        //dm("::::" + top);

//if (isIE6) {top = top - 150;top = top - (420 * (i));}
		if (isIE6) {top = top - 10;}
	        this.resolveOverlap(this.timelines_[i].label, this.timelines_[i].events);
//        top += dayHeight + 10;     
    }
}

TimeLine.prototype.resolveOverlap = function(label, data_) {
    for (var i = 0; i < data_.length; i++) {
        var aT = document.getElementById(label+"table:"+i);
        var from = document.getElementById(label+"from:"+i);
        var middle = document.getElementById(label+i);
        var to = document.getElementById(label+"to:"+i);
        var container = document.getElementById(label+"c"+i);

        var overlapCount = data_[i].overlapCount+1;
        var overlapNumber = data_[i].overlapNumber;
        
        var thisTop = top;
        var topDiff = 0;
        // count heights of overlapped elements before me
        var ola = aT.wy.data_.overlapArray;

        var maxLevel = aT.wy.timeLine.getMaxLevel(data_, i);
        var height = Math.round((dayHeight-34)/maxLevel);

        from.style.height = height + "px";
        middle.style.height = height + "px";
        to.style.height = height + "px";
        container.style.height = height + "px";

        var t = "";
        for (var z = 0; z < ola.length; z++) {
            var olaAT = document.getElementById(label+"table:"+ola[z]);
            var olaC = document.getElementById(label+"c"+i);

            if ((aT.wy.data_.overlapNumber-1) > 0)
                topDiff = height*(aT.wy.data_.overlapNumber-1);
        }

//        aT.title = "ml=" + maxLevel + " : oc=" + overlapCount + " : on=" + overlapNumber + " : dh=" + dayHeight + " : h=" + height +  ": tt=" + thisTop + " //: //td=" + topDiff + " : " + aT.wy.data_.text + ":  \n " + numberOfDaysBetween(aT.wy.data_.fromDate, aT.wy.data_.toDate) + " days from " + formatDate//(aT.wy.data_.fromDate,"MMM d, y") + "   to   " + formatDate(aT.wy.data_.toDate,"MMM d, y");


        aT.title = aT.wy.data_.text + ":  \n " + numberOfDaysBetween(aT.wy.data_.fromDate, aT.wy.data_.toDate) + " days from " + formatDate(aT.wy.data_.fromDate,"MMM d, y") + "   to   " + formatDate(aT.wy.data_.toDate,"MMM d, y");

        container.style.top =  thisTop+topDiff+"px";

        top -= height+2;
    }
}


getYMD = function(date) {
    //return date with only YMD
    return new Date(date.getFullYear() + "/" + (date.getMonth()+1) + "/" + date.getDate());
}

function formatDate(indate, ignore) {
    var dateStr = "";
    dateStr = dayNames[indate.getDay()] + " " + indate.getDate() + " " + monthNames[indate.getMonth()] + " " + indate.getFullYear();
    return dateStr;
}

function chopText(text) {
    var retStr = "";
    for ( var i = 0; i <  text.length; i++) {
        retStr += text.toString().charAt(i) + "<br>";
    }
    return retStr;
}

function doubleClick(e) {
    if (! e) e = event;
    stopEvent(e);
    var src = e.target || e.srcElement;

    var idParts = (""+src.key).split(":");
    var aT = document.getElementById("table:"+idParts[0]);
    if (aT) {
        alert(aT.data_.text + " has a total of " + numberOfDaysBetween(aT.data_.fromDate, aT.data_.toDate) + " days width " + calculateworkingdays(aT.data_.fromDate, aT.data_.toDate) + " working days");
    }
}

var mousedownFromDate = null;
var timelineElement =  null;
var timelineOriginalScrollLeft = 0;
var timelineOriginalClientX = 0;
var acc = new Array();
var latestAcc = 0;
function timelineMouseDown(e) {
    if (! e) e = event;
    stopEvent(e);
    var src = e.target || e.srcElement;
    timelineElement = src.offsetParent;
    //dm("id = " + timelineElement.id);
    var c = timelineElement;//document.getElementById(src.wy.label+"timelineContainer");
    var m = document.getElementById("mainContainer");
    var scrollLeft = m.scrollLeft;
    //dm(m.wy.timeline);

    var posC = findPos(c);
    var xPos = (Math.floor((e.clientX+ scrollLeft- posC[0])/dayWidth) * dayWidth) ;
    var newFromDate = new Date(getYMD(m.wy.timeline.fromDate_).getTime() + (((xPos)/dayWidth)*oneDay));
    mousedownFromDate = newFromDate;
    
    if (e.button==2) {
    
//dm(src.offsetParent.offsetParent.id);
        //src.oncontextmenu = 
        showContextMenu(e,'menu2');
        //src.offsetParent.oncontextmenu = function() {};
        //src.offsetParent.offsetParent.oncontextmenu = showContextMenu(e,2);
        return false;
    }
    
    
    var m = document.getElementById("mainContainer");
    m.style.cursor = "url(images/closedhand.cur),pointer";
//    document.body.style.cursor = "url(images/closedhand.cur),pointer";
    timelineOriginalScrollLeft = m.scrollLeft;
    timelineOriginalClientX = e.clientX;
    document.onmousemove = timelineDragging;
    document.onmouseup = timelineEndDrag;
    return false;
    //alert("yo " + e.clientX + " : " + newFromDate);
}

function timelineDragging(e) {
    if (! e) e = event;
    stopEvent(e);
    var src = e.target || e.srcElement;
    //top = (src.wy.data_.length*-40)+30;
    

    //var idParts = (""+draggedElement.id).split(":");
    //var c = document.getElementById("timelineContainer");
    var m = document.getElementById("mainContainer");   
    //m.style.cursor = "url(images/closedhand.cur)";
    var newScrollLeft = timelineOriginalScrollLeft - (e.clientX - timelineOriginalClientX);
    if (newScrollLeft < 0) newScrollLeft = 0;
    if (newScrollLeft > m.style.width.replace("px","")) newScrollLeft = m.style.width.replace("px","");
    m.scrollLeft = timelineOriginalScrollLeft - (e.clientX - timelineOriginalClientX);
	var prevAcc = latestAcc - 1;
	if (latestAcc < 0) latestAcc = 4;
	acc[latestAcc] = (e.clientX);
	latestAcc += 1;
	if (latestAcc > 4) latestAcc = 0;

    return false;
}

function animAcc(acc, dir) {
	
	var m = document.getElementById("mainContainer");   
	var newScrollLeft = m.scollLeft + acc/5;
	acc = acc - (acc/7);
//	if (newScrollLeft < 0) newScrollLeft = 0;
//    	if (newScrollLeft > m.style.width.replace("px","")) newScrollLeft = m.style.width.replace("px","");
	if (dir == "down")
	    	m.scrollLeft = m.scrollLeft - acc;
	else
	    	m.scrollLeft = m.scrollLeft + acc;

	//dm(acc[0] + ":" + acc[1] + ":" + acc[2] + ":" + acc[3] + ":" + acc[4] + "==:::" + acc );

	if (acc > 3) {
		setTimeout("animAcc(" + acc + ",'" + dir + "')", 10);
	}
}
function timelineEndDrag(e) {
    if (! e) e = event;
    stopEvent(e);
    var src = e.target || e.srcElement;
    //top = (src.wy.data_.length*-40)+30;
    
    var m = document.getElementById("mainContainer");   
    //dm("opening");
//    document.body.style.cursor = "";
    m.style.cursor = "url(images/openhand.cur),pointer";
    //dm("opened");
    document.onmousemove = null;
    document.onmouseup = null;

	var maxAcc = -10000;
	var minAcc = 10000;
	var up = 0;
	var down = 0;
	for (var i = 0; i < 5; i++) {
		if (acc[i] != "undefined") {
			if (i < 4) {
				if (acc[i] > acc[i+1]) {
					down++;
				}
				else {
					up++;
				}
			}
			else {
				if (acc[4] > acc[0]) {
					down++;
				}
				else {
					up++;
				}
			}
			if (acc[i] >  maxAcc) {
				maxAcc = acc[i];
			}
			if (acc[i] < minAcc) {
				minAcc = acc[i];
			}
		}
	}
	//dm(acc[0] + ":" + acc[1] + ":" + acc[2] + ":" + acc[3] + ":" + acc[4] + "==" + (maxAcc - minAcc)  + "::" + up + "::" + down);
	if (up < down)
		animAcc((maxAcc-minAcc)/3,"up");
	else
		animAcc((maxAcc-minAcc)/3,"down");


    return false;
}

// DRAGGING STUFF
var draggedElement = null;
var newWidth = 0;
var originalXPos = 0;
var originalFromDate = null;
var originalToDate = null;
TimeLine.prototype.dragStart = function(e) {
    if (! e) e = event;
    stopEvent(e);
    var src = e.target || e.srcElement;
    draggedElement = src;
    if (e.button==2) {
        src.oncontextmenu = showContextMenu;
        return false;
    }

    var dataOverlap = draggedElement.wy.timeLine.getOverlaps();

    // inc zindex
    var container = null;
    container = document.getElementById(draggedElement.wy.label+"c"+draggedElement.wy.i);
    container.style.zIndex = zindex++;

    var c = document.getElementById(draggedElement.wy.label+"timelineContainer");
    var posC = findPos(c);
    originalXPos = (Math.round((e.clientX- posC[0])/dayWidth) * dayWidth) + document.getElementById("mainContainer").scrollLeft;
    originalFromDate = draggedElement.wy.data_.fromDate;
    originalToDate = draggedElement.wy.data_.toDate;
        
    document.onmousemove = this.wy.timeLine.dragging;
    document.onmouseup = this.wy.timeLine.dragEnd;
    return false;
}
TimeLine.prototype.dragging = function (e) {
//dm("timeline dragging");
    if (! e) e = event;
    stopEvent(e);
    var src = e.target || e.srcElement;
    //top = (src.wy.data_.length*-40)+30;
    

    var idParts = (""+draggedElement.id).split(":");
    var c = document.getElementById(draggedElement.wy.label+"timelineContainer");
    var m = document.getElementById("mainContainer");
    var scrollLeft = m.scrollLeft;
    //dm("d:"+(idParts[0]) + "  -  " + scrollLeft);
    if (idParts[0] == draggedElement.wy.label+"to") {

        var aT = document.getElementById(draggedElement.wy.label+"table:"+draggedElement.wy.i);
        var posC = findPos(c);
        var xPos = (Math.floor((e.clientX+ scrollLeft- posC[0])/dayWidth) * dayWidth) ;
        var newToDate = new Date(getYMD(aT.wy.data_.containerFromDate).getTime() + (((xPos)/dayWidth)*oneDay));
        var newFromDate = new Date(getYMD(aT.wy.data_.fromDate).getTime());
        if (newToDate < new Date(getYMD(newFromDate).getTime() + (oneDay * 1))) newFromDate = new Date(getYMD(newToDate).getTime() - (oneDay*1));
        moveBooking(draggedElement.wy.label, draggedElement.wy.i, newFromDate, newToDate);

    }
    else if (idParts[0] == draggedElement.wy.label+"from") {
        // get left of middle block
        var aT = document.getElementById(draggedElement.wy.label+"table:"+draggedElement.wy.i);
        var posC = findPos(c);
        var xPos = (Math.floor((e.clientX+ scrollLeft- posC[0])/dayWidth) * dayWidth) ;
        var newFromDate = new Date(getYMD(aT.wy.data_.containerFromDate).getTime() + (((xPos)/dayWidth)*oneDay));
        var newToDate = new Date(getYMD(aT.wy.data_.toDate).getTime());
        if (newToDate < new Date(getYMD(newFromDate).getTime() + (oneDay * 1))) newToDate = new Date(getYMD(newFromDate).getTime() + (oneDay*1));
        moveBooking(draggedElement.wy.label, draggedElement.wy.i, newFromDate, newToDate);


    }
    else {

        var posC = findPos(c);
        var xPos = (Math.floor((e.clientX+ scrollLeft- posC[0])/dayWidth) * dayWidth);
        var daysDiff = (xPos - originalXPos)/dayWidth;
        var newToDate = new Date(getYMD(originalToDate).getTime() + (daysDiff*oneDay));
        var newFromDate = new Date(getYMD(originalFromDate).getTime() + (daysDiff*oneDay));
        moveBooking(draggedElement.wy.label, draggedElement.wy.i, newFromDate,newToDate);
    //dm(originalFromDate + "@ " + newFromDate);

    }
    top = drawTop;
    var dataOverlap = draggedElement.wy.timeLine.getOverlaps();
    top = drawTop;
    draggedElement.wy.timeLine.resolveOverlaps();
    var mc = document.getElementById("mainContainer");
    mc.replaceChild(dataOverlap, draggedElement.wy.timeLine.ol);
    //draggedElement.wy.timeLine.containerDiv_.replaceChild(dataOverlap, draggedElement.wy.timeLine.ol);
    draggedElement.wy.timeLine.ol = dataOverlap;

    return false;

}
TimeLine.prototype.dragEnd = function(e) {
    if (! e) e = event;
    stopEvent(e);
    var src = e.target || e.srcElement;

    var idParts = (""+draggedElement.key).split(":");

    // clear up
    document.onmousemove = null;
    document.onmouseup = null;
    draggedElement = null;
    return false;
}


function showContextMenu(e, menu) {
    if (! e) e = event;
    stopEvent(e);
    document.getElementById("menu").style.visibility = "hidden";
    document.getElementById("menu2").style.visibility = "hidden";
    if (!menu) {
        menu="menu";
        //dm(menu);
    }
//    var src = e.target || e.srcElement;
    var menu = document.getElementById(menu);
    menu.style.zIndex = zindex++;
    menu.style.top = e.clientY-4 + getScrollXY()[1] + "px";
    menu.style.left = e.clientX-50 + getScrollXY()[0] + "px";
    menu.style.visibility = "visible";

    return false;
}


function getScrollXY() {
    var x = 0, y = 0;
    if( typeof( window.pageYOffset ) == 'number' ) {
        // Netscape
        x = window.pageXOffset;
        y = window.pageYOffset;
    } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
        // DOM
        x = document.body.scrollLeft;
        y = document.body.scrollTop;
    } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
        // IE6 standards compliant mode
        x = document.documentElement.scrollLeft;
        y = document.documentElement.scrollTop;
    }
    return [x, y];
}
  
function hideContextMenu(menu) {
    var menu = document.getElementById(menu);
    menu.style.visibility = "hidden";

    return false;
}


var zindex = 100;
function moveBooking(label, id, newFromDate,newToDate) {
    var aT = document.getElementById(label+"table:"+id);
    var from = document.getElementById(label+"from:"+id);
    var middle = document.getElementById(label+id);
    var to = document.getElementById(label+"to:"+id);
    var container = document.getElementById(label+"c"+id);
    var posMiddle = findPos(middle);
    var posContainer = findPos(container);

    var daysTo = (getYMD(newFromDate).getTime() - getYMD(aT.wy.data_.containerFromDate).getTime())/oneDay;
    var tdTo = (daysTo * dayWidth) - 1;
    var daysBetween = (getYMD(newToDate).getTime()-getYMD(newFromDate).getTime())/oneDay;
    var tdWidth = ((daysBetween * dayWidth) - 1 + dayWidth);
    aT.wy.data_.fromDate = newFromDate;
    aT.wy.data_.fromDateYMD = getYMD(newFromDate,"");
    aT.wy.data_.toDate = newToDate;
    aT.wy.data_.toDateYMD = getYMD(newToDate,"");

    from.style.width = Math.round(dayWidth/2) + "px";
    to.style.width = Math.round(dayWidth/2) + "px";
    container.style.left = tdTo + "px";

    //dm("dayWidth = " + dayWidth + "    tdTo = " + tdTo + "      tdWidth = " + tdWidth);
    if ((tdWidth - 1) > 0) {
        container.style.width = (tdWidth) + "px";   
    }
    else {
        container.style.width = "0px";   
    }
    if ((tdWidth - (dayWidth * 1) - 1) > 0) {
        middle.style.width = (tdWidth - (dayWidth * 1)) + "px";
    }
    else {
        middle.style.width = "0px";
    }
//    aT.title = "oc="+aT.wy.data_.overlapCount +  ":oN=" + aT.wy.data_.overlapNumber + ":" + aT.wy.data_.text + ":  \n from " + formatDate(newFromDate,"MMM d, y") + "   to   " + formatDate(newToDate,"MMM d, y");
    aT.title = aT.wy.data_.text + ":  \n from " + formatDate(newFromDate,"MMM d, y") + "   to   " + formatDate(newToDate,"MMM d, y");

}



function dm(m) {
    document.getElementById("message").innerHTML = m;
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
	    do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [curleft,curtop];
}

function stopEvent(e) {
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
	
}

function numberOfDaysBetween(fromDate, toDate) {
    return ((getYMD(toDate).getTime() - getYMD(fromDate).getTime())/oneDay)+1;
}

function calculateworkingdays(startDate, endDate)
{
    var stDate = new Date(startDate);
    var enDate = new Date(endDate);
    var startDateYear = stDate.getFullYear();
    var startDateMonth = stDate.getMonth();
    var startDateDat = stDate.getDate();
    var endDateYear = enDate.getFullYear();
    var endDateMonth = enDate.getMonth();
    var endDateDat = enDate.getDate();

    ssDate = new Date(startDateYear,startDateMonth,startDateDat);
    eeDate = new Date(endDateYear,endDateMonth,endDateDat);
    if (ssDate > eeDate) {
        return -1;
    }
    workingdays=0;
    while (ssDate <= eeDate)
    {
        if(ssDate.getDay()!=0 && ssDate.getDay()!=6)
        {
            workingdays++;
        }
        ssDate=new Date(ssDate.valueOf()+86400000);
    }
    return workingdays;
} 
// Returns true if the passed value is found in the
// array. Returns false if it is not.
//Note : If you don’t want to perform case sensitive check, then set caseSensitve=true and call the function.
Array.prototype.inArray = function (value,caseSensitive) {
    var i;
    for (i=0; i < this.length; i++) {
    // use === to check for Matches. ie., identical (===),
        if(caseSensitive){ //performs match even the string is case sensitive
            if (this[i].toLowerCase() == value.toLowerCase()) {
                return true;
            }
        }
        else {
            if (this[i] == value) {
                return true;
            }
        }
    }
    return false;
}
