// http://therealcrisp.xs4all.nl/blog/2006/12/04/tojsonstring-and-objectprototype/
if (!Object.prototype.hasOwnProperty) {
	Object.prototype.hasOwnProperty = function(p) {
		return typeof( this[p] ) != 'function';
	}
}

// http://www.faqts.com/knowledge_base/view.phtml/aid/3838
// http://hexmen.com/blog/2006/12/push-and-pop/
if (!Array.prototype.push) {
	Array.prototype.push = function() {
		for ( var i=0; i<arguments.length; i+=1 ) {
			this[this.length] = arguments[i];
		}
	}
}

var colorapp = new function() {
	
	this.colors = [];
	this.json_obj = {}; // defined via json.php

	this.padString = function(str,size,pad) {
		str = "" + str + "";
		while ( str.length < size ) {
			str = pad + str;
		}
		return str;
	};
	
	this.ColorAppException = function( message ) {
		this.message = message;
		this.name = 'ColorAppException';
	};

	this.hexToDecimal = function(h) { return parseInt(h,16); };
	this.decimalToHex = function(d) { return d.toString(16); };
	
	this.initColorApp = function(e) {
		var now = new Date();
		var today = now.getFullYear() + '-' + colorapp.padString( now.getMonth() + 1, 2, '0' ) + '-' + colorapp.padString( now.getDate(), 2, '0' );
		var palette;
		var p;
		var tmp1;
		var tmp2 = new Date( 1970, 0, 1 );
		colorapp.colorScheme = new colorapp.ColorScheme();
		
		for ( var i in colorapp.json_obj ) {
			if ( colorapp.json_obj[i] && colorapp.json_obj[i]['date'] ) { //&& colorapp.json_obj[i]['date'] == today ) {
				if ( colorapp.json_obj[i]['date'] == today ) {
					palette = colorapp.json_obj[i];
					break;
				}
				else {
					tmp1 = new Date(
						parseInt( colorapp.json_obj[i]['date'].substr(0,4) )
						,parseInt( colorapp.json_obj[i]['date'].substr(5,2) ) - 1
						,parseInt( colorapp.json_obj[i]['date'].substr(8,2) )
					);
					if ( tmp1 > tmp2 ) {
						p = colorapp.json_obj[i];
						tmp2 = tmp1;
					}
				}
			}
		}
		
		if ( !palette ) {
			palette = p;
			today = palette['date'];
		}
		p = null;
		colorapp.selectedSample = new colorapp.SelectedSample( palette );
		var d = xGetElementById( 'd' + today );
		if ( d ) {
			colorapp.currentSampleBox = d;
			xAddClass( colorapp.currentSampleBox, 'currentSelectedSampleBox' );
		}
		
		var ele = xGetElementById( 'sets' );
		var eles = xGetElementsByClassName( 'sample', ele );
		for ( var i=0; i< eles.length; i++ ) {
			xAddEventListener( eles[i], 'click', colorapp.sampleBoxOnClick );
		}
		
		var ele = xGetElementById( 'selectedsample' );
		var eles = xGetElementsByClassName( 'sample', ele );
		for ( var i=0; i< eles.length; i++ ) {
			try {
				if ( eles[i].id != 'selectedColorSet' ) {
					xAddEventListener( eles[i], 'click', colorapp.selectedSampleBoxOnClick );
				}
			}
			catch(e) {
				alert( 'error' );
			}
		}
		
		var ele = xGetElementById( 'display' );
		var eles = xGetElementsByTagName( 'a', ele );
		for ( var i=0; i<eles.length; i++ ) {
			xAddEventListener( eles[i], 'mouseover', colorapp.setDisplayLinkMouseOver );
			xAddEventListener( eles[i], 'mouseout',  colorapp.setDisplayLinkMouseOut );
		}
		
	};
	
	
	
/* **** start define setDisplayLinkMouseOver **** */
	this.setDisplayLinkMouseOver = function(e) {
		var ele = new xEvent(e);
		if ( ele.target.overBackgroundColor ) {
			ele.target.style.backgroundColor = ele.target.overBackgroundColor;
		}
		if ( ele.target.overColor ) {
			ele.target.style.color = ele.target.overColor;
		}
	};
/* **** end define setDisplayLinkMouseOver **** */
	
	
/* **** start define setDisplayLinkMouseOut **** */
	this.setDisplayLinkMouseOut  = function(e) {
		var ele = new xEvent(e);
		if ( ele.target.outBackgroundColor ) {
			ele.target.style.backgroundColor = ele.target.outBackgroundColor;
		}
		if ( ele.target.outColor ) {
			ele.target.style.color = ele.target.outColor;
		}
	};
/* **** end define setDisplayLinkMouseOut **** */
	
	
	
	
/* **** start define sampleBoxOnClick **** */
	this.sampleBoxOnClick = function(e) {
		if ( colorapp.currentSampleBox ) {
			xRemoveClass( colorapp.currentSampleBox, 'currentSelectedSampleBox' );
		}
		ele = colorapp.getValidSampleDiv(e);
		var xfor = ele.className.match( /\bfor:[^\b]+\b/ );
		if ( xfor[0] ) {
			xfor = xfor[0].replace( /\bfor:+\b/, '' );
			if ( colorapp.json_obj[xfor] ) {
				var palette = colorapp.json_obj[ xfor ];
				colorapp.selectedSample = new colorapp.SelectedSample( palette );
				colorapp.currentSampleBox = ele;
				xAddClass( colorapp.currentSampleBox, 'currentSelectedSampleBox' );
			}
		}
	}
/* **** end define sampleBoxOnClick **** */
	
	
	
	
/* **** start define selectedSampleBoxOnClick **** */
	this.selectedSampleBoxOnClick = function(e) {
		ele = colorapp.getValidSampleDiv(e);
		colorapp.selectedSample.setSelectedColorSetBox( colorapp.selectedSample.states[ele.id] );
	}
/* **** end define selectedSampleBoxOnClick **** */
	
	
	
	
	
/* **** start define getValidSampleDiv **** */
	this.getValidSampleDiv = function(e) {
		function getParent(ele) {
			if ( ele.className.search( /\bsample\b/ ) == -1 ) {
				return getParent( xParent(ele,true) );
			}
			else {
				return ele;
			}
		}
		e = new xEvent(e);
		var ele = getParent(e.target);
		return ele;
	}
/* **** end define getValidSampleDiv **** */
	
	
	
	
	
	
}
xAddEventListener( window, 'load', colorapp['initColorApp'] );



