// BEGIN COUNTER CLASS DECLARATION
function counter()
{
	// set the counter constructor variables
	this.Top = 10;
	this.Left = 10;
	this.backgroundColor = "blue";
	this.textColor = "yellow";
	this.borderColor = "black";
	this.borderWidth = 1;
	this.forwardAddress = "http://link1";
	this.GUID = 1531190115;
	this.counterStartTime = 25;
        this.counterAlertTime = 24; 
        this.textSize = 24;
        this.textFont = "Arial";
        this.displayText = "";

	this.cookieDontShowCounter = false;
	this.cookieDontShow = false;
	
	this.browserName = navigator.appName;
	this.browserVer = parseInt(navigator.appVersion);

	this.intervalAccumulator = 0;
	// TODO: check for cookie, calculate counterTimeLeft as a function
	// of counterCookieTime, currentTime, and counterStartTime
	this.originalStartTime = this.counterStartTime;
	this.counterTimeLeft = this.counterStartTime;
	this.stopCounter = false;
	this.counterEnded = false;
	
	this.netscapeAccumulator = 0;

	// set counterTicksLeft (ms)
	// set derivative times to 0

	this.counterTicksLeft = this.counterTimeLeft * 100;
	this.alertTicks = this.counterAlertTime * 100;
	this.counterDigits = 0;
	
	this.ms1=0;
	this.ms2=0;
	this.sec1=0;
	this.sec2=0;
	this.min1=0;
	this.min2=0;
	this.hr1=0;
	this.hr2=0;

	this.t;
	
	this.myGlide = null;
}

function counterConvertTime(ticks)
// this converts from ms to individual digits (hh mm ss msms)
{
	this.ms1=0;
	this.ms2=0;
	this.sec1=0;
	this.sec2=0;
	this.min1=0;
	this.min2=0;
	this.hr1=0;
	this.hr2=0;
	this.ms1 = ticks%10;
	if (ticks>10) {
		this.ms2=(ticks-ticks%10)/10 %10;
		if (ticks>100) {
			this.sec1=(ticks-ticks%100)/100 %10;
			if (ticks>1000) {
				this.sec2=(ticks-ticks%1000)/1000 % 6;
				if (ticks>6000) {
					this.min1=(ticks-ticks%6000)/6000 %10;
					if (ticks>60000) {
						this.min2=(ticks-ticks%60000)/60000 %6;
						if (ticks>360000) {
							this.hr1=(ticks-ticks%360000)/360000 %10;
							if (ticks>3600000) {
							  this.hr2=ticks-ticks%3600000;
							}
						}
					}
				}
			}
		}
	}
}

function counterCountDown()
{
	interval = 3;
		  
	if(!this.stopCounter)
	{
		this.counterConvertTime( this.counterTicksLeft );
		this.counterDigits = (this.hr2 + "" + this.hr1 + ":" + this.min2 + "" + this.min1 + ":" + this.sec2 + "" + this.sec1);// + "." + this.ms2 + "" + this.ms1 );
	        document.getElementById('counter').innerHTML = this.counterDigits;
                if(document.getElementById('staticCount'))
                    document.getElementById('staticCount').innerHTML = this.counterDigits;
		this.counterTicksLeft = this.counterTicksLeft - interval;
	}
	if(this.counterTicksLeft >= 0 && !this.stopCounter)
	{
		this.t = setTimeout("myCounter.counterCountDown()", interval*10);
	}
	else
	{
		this.counterSendToAddress();
		this.counterEnded = true;
	}
	this.intervalAccumulator = this.intervalAccumulator + interval;
	
	if(this.alertTicks >= this.counterTicksLeft && this.intervalAccumulator%(5*interval) == 0 && !this.stopCounter)
	{
	    var cColor = new RGBColor(document.getElementById('counter').style.color);
	    var tColor = new RGBColor(this.textColor);
	    
	    if(cColor.toHex() == tColor.toHex())
	        document.getElementById('counter').style.color = this.backgroundColor;
	    else
	        document.getElementById('counter').style.color = this.textColor;
	    this.intervalAccumulator = 0;
	}
	
	if(this.browserName == "Netscape")
	{
	    this.netscapeAccumulator = this.netscapeAccumulator + interval;
	    if(this.netscapeAccumulator%(100*interval) == 0)
	    {
               var myCookies = new Array();
               var foundDontShow = -1;
               var foundStartTime = -1;
               var foundStartDate = -1;
               var currentDate = new Date();
               var dateString = currentDate.getDate() + ":" + currentDate.getMonth() + ":" + currentDate.getYear();
               var currentHr = currentDate.getHours();
               var currentMin = currentDate.getMinutes();
               var currentSec = currentDate.getSeconds();
               myCookies = document.cookie.split(";");

	       for(count = 0; count < myCookies.length; count++)
	       {
	          if(this.counterStrTrim(myCookies[count].split("=")[0]) == "DontShow" + this.GUID)
	             foundDontShow = count;
	          else if(this.counterStrTrim(myCookies[count].split("=")[0]) == "StartTime" + this.GUID)
	             foundStartTime = count;
	          else if(this.counterStrTrim(myCookies[count].split("=")[0]) == "StartDate" + this.GUID)
	             foundStartDate = count;
	       }
	       if(foundStartTime > -1 && foundStartDate > -1 && foundDontShow > -1 && dateString == myCookies[foundStartDate].split("=")[1])
	       {
	          cookieTime = myCookies[foundStartTime].split("=")[1].split(":");
	          var elapsedTime = ((currentHr - cookieTime[0]) * 3600) + ((currentMin - cookieTime[1]) * 60) + currentSec - cookieTime[2];
		  var tempCounterTicksLeft = (this.originalStartTime - elapsedTime) * 100;
		  if((this.counterTicksLeft - 100) > tempCounterTicksLeft)
		  	this.counterTicksLeft = tempCounterTicksLeft;
	       }
	       this.netscapeAccumulator = 0;
	    }
	}
}

function counterBuild()
{
	
	// counterPos should always be set in a div
	var contents = document.getElementById('counterPos').innerHTML;
	var counter_text = 
	  '<div id="counterWrapper" style="margin-left:4px; margin-right:4; border-style:solid;' 
	  + 'background-color:' + this.backgroundColor + '; border-color:' + this.borderColor + '; border-width:' + this.borderWidth + 'px;">' 
	  + '<center><label style="font-weight:bold; padding:5px; color:' + this.textColor + '; font-family:' + this.textFont 
	  + '; font-size: ' + this.textSize + 'pt;" type="text" id="counter" >'
	  + '</label></center>';
	var text_text = '<div style="padding-left:3px; padding-right:3px;"><label style="font-size:' + Math.floor(0.75 * this.textSize) + ';">'
	  + this.displayText +'</label></div>';
	
	if(this.displayText.length > 0)
	  counter_text = counter_text + text_text;
	  
	counter_text = counter_text + '</div>';
	
//	alert(counter_text);
	document.getElementById('counterPos').innerHTML = contents + counter_text;
	this.counterCountDown(this.counterTimeLeft);
}

function counterPosition()
{
	var newdiv = document.createElement('div');
        var divIdName = 'counterPos';
	newdiv.setAttribute('id',divIdName);
	newdiv.style.position = 'absolute';
	newdiv.style.zIndex = 1000;
	//document.body.appendChild(newdiv);
	document.write("<div id=\"div_counter\"></div>");
	document.getElementById('div_counter').appendChild(newdiv);
}

function counterUsingPopupCounter(sTime, aTime, top, left, bkColor, txtColor, bordColor, bordWidth, address, guid, txtSize, txtFont, dispText)
{
	this.Top = top;
	this.Left = left;
	this.backgroundColor = bkColor;
	this.textColor = txtColor;
	this.borderColor = bordColor;
	this.borderWidth = bordWidth;
	this.forwardAddress = address;
	this.GUID = guid;
	this.counterStartTime = sTime;
	this.originalStartTime = sTime;
        this.counterAlertTime = aTime;
        this.textSize = txtSize;
        this.textFont = txtFont;
        this.displayText = dispText;
    
       	this.counterTimeLeft = this.counterStartTime;
	this.counterTicksLeft = this.counterTimeLeft * 100;
	this.alertTicks = this.counterAlertTime * 100;
	myCounter.counterCheckCookies();
	myCounter.counterIsTimeLow();

        if(!this.cookieDontShow)
        {
        	var currentDate = new Date();
           	var dateString = currentDate.getDate() + ":" + currentDate.getMonth() + ":" + currentDate.getYear();
           	var timeString = currentDate.getHours() + ":" + currentDate.getMinutes() + ":" + currentDate.getSeconds();
       	        document.cookie = 'StartDate'+ this.GUID +'=' + dateString + '; expires=Thu, 2 Aug 2099 20:47:11 UTC; path=/';
       	        document.cookie = 'StartTime'+ this.GUID +'=' + timeString + '; expires=Thu, 2 Aug 2099 20:47:11 UTC; path=/';
        }
        else
        {
        	this.counterTimeLeft =  this.counterStartTime;
        	this.counterTicksLeft = this.counterTimeLeft * 100;
        }
        if(!this.cookieDontShowCounter)
        {
		this.counterPosition();
		this.counterBuild();
		document.onload = this.setGliding(); 
	}
}
function counterSendToAddress()
{
   if(this.forwardAddress != "none")
        window.location = this.forwardAddress;
}
function setGliding()
{
    this.myGlide = new Glider('counterPos',this.Top, this.Left, null, null, 700,-1);
    this.myGlide.show();
}

function counterCheckCookies()
{
   var myCookies = new Array();
   var cookieTime = new Array();
   var foundDontShow = -1;
   var foundStartTime = -1;
   var foundStartDate = -1;
   var timeLeft = false;
   var count;
   var currentDate = new Date();
   var dateString = currentDate.getDate() + ":" + currentDate.getMonth() + ":" + currentDate.getYear();
   var currentHr = currentDate.getHours();
   var currentMin = currentDate.getMinutes();
   var currentSec = currentDate.getSeconds();

   myCookies = document.cookie.split(";");
   for(count = 0; count < myCookies.length; count++)
   {
      if(this.counterStrTrim(myCookies[count].split("=")[0]) == "DontShow" + this.GUID)
         foundDontShow = count;
      else if(this.counterStrTrim(myCookies[count].split("=")[0]) == "StartTime" + this.GUID)
         foundStartTime = count;
      else if(this.counterStrTrim(myCookies[count].split("=")[0]) == "StartDate" + this.GUID)
         foundStartDate = count;
   }

   if(foundStartTime > -1 && foundStartDate > -1 && foundDontShow > -1 && dateString == myCookies[foundStartDate].split("=")[1])
   {
      cookieTime = myCookies[foundStartTime].split("=")[1].split(":");
      var elapsedTime = ((currentHr - cookieTime[0]) * 3600) + ((currentMin - cookieTime[1]) * 60) + currentSec - cookieTime[2];
      if(elapsedTime < this.counterStartTime)
      {
         timeLeft = true;
         this.counterStartTime = this.counterStartTime - elapsedTime;
      }
   }
   if(foundDontShow > -1 && !timeLeft)
   {
       this.cookieDontShowCounter = true;
       setTimeout("myCounter.counterSendToAddress()", 1);
   }
   if(foundDontShow > -1)
   {
       this.cookieDontShow = true;
   }
   setTimeout("myCounter.counterSetDontShowCookie()", 1000);
   if(this.counterTicksLeft < 200)
	setTimeout("myCounter.counterCheckCookies()", 5000);
}

function counterIsTimeLow()
{
  if(this.counterTicksLeft < 200)
	setTimeout("myCounter.counterCheckCookies()", 200);
  else
  	setTimeout("myCounter.counterIsTimeLow()", 100);
}

function counterSetDontShowCookie()
{
   document.cookie = 'DontShow'+ this.GUID +'=true; expires=Thu, 2 Aug 2099 20:47:11 UTC; path=/';
}

function counterStrTrim(inputString) 
{
   // Removes leading and trailing spaces from the passed string. Also removes
   // consecutive spaces and replaces it with one space. If something besides
   // a string is passed in (null, custom object, etc.) then return the input.
   if (typeof inputString != "string") { return inputString; }
   var retValue = inputString;
   var ch = retValue.substring(0, 1);
   while (ch == " ") { // Check for spaces at the beginning of the string
      retValue = retValue.substring(1, retValue.length);
      ch = retValue.substring(0, 1);
   }
   ch = retValue.substring(retValue.length-1, retValue.length);
   while (ch == " ") { // Check for spaces at the end of the string
      retValue = retValue.substring(0, retValue.length-1);
      ch = retValue.substring(retValue.length-1, retValue.length);
   }
   while (retValue.indexOf("  ") != -1) { // Note that there are two spaces in the string - look for multiple spaces within the string
      retValue = retValue.substring(0, retValue.indexOf("  ")) + retValue.substring(retValue.indexOf("  ")+1, retValue.length); // Again, there are two spaces in each of the strings
   }
   return retValue; // Return the trimmed string back to the user
} // Ends the "trim" function

function counterEnd()
{
   cntPos = document.getElementById('counterPos');
   cntPos.parentNode.removeChild(cntPos);
   this.stopCounter = true;
   this.counterTimeLeft = 0;
}

counter.prototype.counterConvertTime = counterConvertTime;
counter.prototype.counterCountDown = counterCountDown;
counter.prototype.counterBuild = counterBuild;
counter.prototype.counterPosition = counterPosition;
counter.prototype.counterUsingPopupCounter = counterUsingPopupCounter;
counter.prototype.counterSendToAddress = counterSendToAddress;
counter.prototype.setGliding = setGliding;
counter.prototype.counterCheckCookies = counterCheckCookies;
counter.prototype.counterIsTimeLow = counterIsTimeLow;
counter.prototype.counterStrTrim = counterStrTrim;
counter.prototype.counterSetDontShowCookie = counterSetDontShowCookie;
counter.prototype.counterEnd = counterEnd;

// END COUNTER CLASS DECLARATION

//BEGIN COLOR CLASS
function RGBColor(color_string)
{
    this.ok = false;

    // strip any leading #
    if (color_string.charAt(0) == '#') { // remove # if any
        color_string = color_string.substr(1,6);
    }

    color_string = color_string.replace(/ /g,'');
    color_string = color_string.toLowerCase();

    // before getting into regexps, try simple matches
    // and overwrite the input
    var simple_colors = {
        aliceblue: 'f0f8ff',
        antiquewhite: 'faebd7',
        aqua: '00ffff',
        aquamarine: '7fffd4',
        azure: 'f0ffff',
        beige: 'f5f5dc',
        bisque: 'ffe4c4',
        black: '000000',
        blanchedalmond: 'ffebcd',
        blue: '0000ff',
        blueviolet: '8a2be2',
        brown: 'a52a2a',
        burlywood: 'deb887',
        cadetblue: '5f9ea0',
        chartreuse: '7fff00',
        chocolate: 'd2691e',
        coral: 'ff7f50',
        cornflowerblue: '6495ed',
        cornsilk: 'fff8dc',
        crimson: 'dc143c',
        cyan: '00ffff',
        darkblue: '00008b',
        darkcyan: '008b8b',
        darkgoldenrod: 'b8860b',
        darkgray: 'a9a9a9',
        darkgreen: '006400',
        darkkhaki: 'bdb76b',
        darkmagenta: '8b008b',
        darkolivegreen: '556b2f',
        darkorange: 'ff8c00',
        darkorchid: '9932cc',
        darkred: '8b0000',
        darksalmon: 'e9967a',
        darkseagreen: '8fbc8f',
        darkslateblue: '483d8b',
        darkslategray: '2f4f4f',
        darkturquoise: '00ced1',
        darkviolet: '9400d3',
        deeppink: 'ff1493',
        deepskyblue: '00bfff',
        dimgray: '696969',
        dodgerblue: '1e90ff',
        feldspar: 'd19275',
        firebrick: 'b22222',
        floralwhite: 'fffaf0',
        forestgreen: '228b22',
        fuchsia: 'ff00ff',
        gainsboro: 'dcdcdc',
        ghostwhite: 'f8f8ff',
        gold: 'ffd700',
        goldenrod: 'daa520',
        gray: '808080',
        green: '008000',
        greenyellow: 'adff2f',
        honeydew: 'f0fff0',
        hotpink: 'ff69b4',
        indianred : 'cd5c5c',
        indigo : '4b0082',
        ivory: 'fffff0',
        khaki: 'f0e68c',
        lavender: 'e6e6fa',
        lavenderblush: 'fff0f5',
        lawngreen: '7cfc00',
        lemonchiffon: 'fffacd',
        lightblue: 'add8e6',
        lightcoral: 'f08080',
        lightcyan: 'e0ffff',
        lightgoldenrodyellow: 'fafad2',
        lightgrey: 'd3d3d3',
        lightgreen: '90ee90',
        lightpink: 'ffb6c1',
        lightsalmon: 'ffa07a',
        lightseagreen: '20b2aa',
        lightskyblue: '87cefa',
        lightslateblue: '8470ff',
        lightslategray: '778899',
        lightsteelblue: 'b0c4de',
        lightyellow: 'ffffe0',
        lime: '00ff00',
        limegreen: '32cd32',
        linen: 'faf0e6',
        magenta: 'ff00ff',
        maroon: '800000',
        mediumaquamarine: '66cdaa',
        mediumblue: '0000cd',
        mediumorchid: 'ba55d3',
        mediumpurple: '9370d8',
        mediumseagreen: '3cb371',
        mediumslateblue: '7b68ee',
        mediumspringgreen: '00fa9a',
        mediumturquoise: '48d1cc',
        mediumvioletred: 'c71585',
        midnightblue: '191970',
        mintcream: 'f5fffa',
        mistyrose: 'ffe4e1',
        moccasin: 'ffe4b5',
        navajowhite: 'ffdead',
        navy: '000080',
        oldlace: 'fdf5e6',
        olive: '808000',
        olivedrab: '6b8e23',
        orange: 'ffa500',
        orangered: 'ff4500',
        orchid: 'da70d6',
        palegoldenrod: 'eee8aa',
        palegreen: '98fb98',
        paleturquoise: 'afeeee',
        palevioletred: 'd87093',
        papayawhip: 'ffefd5',
        peachpuff: 'ffdab9',
        peru: 'cd853f',
        pink: 'ffc0cb',
        plum: 'dda0dd',
        powderblue: 'b0e0e6',
        purple: '800080',
        red: 'ff0000',
        rosybrown: 'bc8f8f',
        royalblue: '4169e1',
        saddlebrown: '8b4513',
        salmon: 'fa8072',
        sandybrown: 'f4a460',
        seagreen: '2e8b57',
        seashell: 'fff5ee',
        sienna: 'a0522d',
        silver: 'c0c0c0',
        skyblue: '87ceeb',
        slateblue: '6a5acd',
        slategray: '708090',
        snow: 'fffafa',
        springgreen: '00ff7f',
        steelblue: '4682b4',
        tan: 'd2b48c',
        teal: '008080',
        thistle: 'd8bfd8',
        tomato: 'ff6347',
        turquoise: '40e0d0',
        violet: 'ee82ee',
        violetred: 'd02090',
        wheat: 'f5deb3',
        white: 'ffffff',
        whitesmoke: 'f5f5f5',
        yellow: 'ffff00',
        yellowgreen: '9acd32'
    };
    for (var key in simple_colors) {
        if (color_string == key) {
            color_string = simple_colors[key];
        }
    }
    // emd of simple type-in colors

    // array of color definition objects
    var color_defs = [
        {
            re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
            example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],
            process: function (bits){
                return [
                    parseInt(bits[1]),
                    parseInt(bits[2]),
                    parseInt(bits[3])
                ];
            }
        },
        {
            re: /^(\w{2})(\w{2})(\w{2})$/,
            example: ['#00ff00', '336699'],
            process: function (bits){
                return [
                    parseInt(bits[1], 16),
                    parseInt(bits[2], 16),
                    parseInt(bits[3], 16)
                ];
            }
        },
        {
            re: /^(\w{1})(\w{1})(\w{1})$/,
            example: ['#fb0', 'f0f'],
            process: function (bits){
                return [
                    parseInt(bits[1] + bits[1], 16),
                    parseInt(bits[2] + bits[2], 16),
                    parseInt(bits[3] + bits[3], 16)
                ];
            }
        }
    ];

    // search through the definitions to find a match
    for (var i = 0; i < color_defs.length; i++) {
        var re = color_defs[i].re;
        var processor = color_defs[i].process;
        var bits = re.exec(color_string);
        if (bits) {
            channels = processor(bits);
            this.r = channels[0];
            this.g = channels[1];
            this.b = channels[2];
            this.ok = true;
        }

    }

    // validate/cleanup values
    this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);
    this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);
    this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);

    // some getters
    this.toRGB = function () {
        return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';
    }
    this.toHex = function () {
        var r = this.r.toString(16);
        var g = this.g.toString(16);
        var b = this.b.toString(16);
        if (r.length == 1) r = '0' + r;
        if (g.length == 1) g = '0' + g;
        if (b.length == 1) b = '0' + b;
        return '#' + r + g + b;
    }

    // help
    this.getHelpXML = function () {

        var examples = new Array();
        // add regexps
        for (var i = 0; i < color_defs.length; i++) {
            var example = color_defs[i].example;
            for (var j = 0; j < example.length; j++) {
                examples[examples.length] = example[j];
            }
        }
        // add type-in colors
        for (var sc in simple_colors) {
            examples[examples.length] = sc;
        }

        var xml = document.createElement('ul');
        xml.setAttribute('id', 'rgbcolor-examples');
        for (var i = 0; i < examples.length; i++) {
            try {
                var list_item = document.createElement('li');
                var list_color = new RGBColor(examples[i]);
                var example_div = document.createElement('div');
                example_div.style.cssText =
                        'margin: 3px; '
                        + 'border: 1px solid black; '
                        + 'background:' + list_color.toHex() + '; '
                        + 'color:' + list_color.toHex()
                ;
                example_div.appendChild(document.createTextNode('test'));
                var list_item_value = document.createTextNode(
                    ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()
                );
                list_item.appendChild(example_div);
                list_item.appendChild(list_item_value);
                xml.appendChild(list_item);

            } catch(e){}
        }
        return xml;

    }

}
//END COLOR CLASS
var myCounter = new counter();
