/*
 * Base Camel javascript object
 */
YAHOO.namespace( "CamelFW" );

YAHOO.CamelFW.FW = function() {
	
	// Define events
	this.onBeforeFrameworkInit = new YAHOO.util.CustomEvent( "onBeforeFrameworkInit", this );
	this.onAfterFrameworkInit = new YAHOO.util.CustomEvent( "onAfterFrameworkInit", this );

	// Define admin events
	this.onBeforeAdminFrameworkInit = new YAHOO.util.CustomEvent( "onBeforeAdminFrameworkInit", this );
	this.onAfterAdminFrameworkInit = new YAHOO.util.CustomEvent( "onAfterAdminFrameworkInit", this );
	
	// YUI installation directory
	this.YUIInstallDir = "/CAssets/CJSLib/yui-290";
	
	// Do we allow users with IE6 to view the site?
	this.blockIE6 = true;
	// If not; redirect them where?
	// Note that this page has to be translated in the translation files!!
	this.redirectPage = "browser-not-supported.html";
}

YAHOO.CamelFW.FW.prototype.Initialize = function() {
	
	// Inform the world we're starting the initialization
	this.onBeforeFrameworkInit.fire();
	
	// Check for browser make and version
	this.redirectIE6();
	
	// Inform the world we finished initializing
	this.onAfterFrameworkInit.fire();
}

/**
 * Checks the browser make and version.
 * If the UserAgent is IE6 and blockIE6
 * is TRUE; redirect to the blokking page.
 */
YAHOO.CamelFW.FW.prototype.redirectIE6 = function() {
	
	if (( YAHOO.env.ua.ie > 0 ) && ( YAHOO.env.ua.ie < 7 ) && this.blockIE6 ) {
		
		// Redirect if we're not already on the redirect page
		var redirectPage = "/" + this.Translate( this.redirectPage );
		if ( window.location.pathname != redirectPage ) {
			
			window.location.href = redirectPage;
		}
	}
}

/**
 * Translates string s into the language that is currently used.
 * Language strings are added to the CamelFW object by the script
 * 'CLanguage.js.php' which must be loaded after CamelFW.js and
 * before the framework is initialized.
 * 
 * @param {string} s
 */
YAHOO.CamelFW.FW.prototype.Translate = function( s ) {
	
	var md5 = this.MD5( s );
	if ( this.LanguageStrings[md5] !== undefined )
	{
		return this.LanguageStrings[md5];
	}
	else
	{
		return s;
	}
}

/**
 * MD5 (Message-Digest Algorithm)
 * Source: http://www.webtoolkit.info/
 */
YAHOO.CamelFW.FW.prototype.MD5 = function(s){
	function L(b,a){return(b<<a)|(b>>>(32-a))}
	function K(k,b){var F,a,d,x,c;d=(k&2147483648);x=(b&2147483648);F=(k&1073741824);a=(b&1073741824);c=(k&1073741823)+(b&1073741823);if(F&a){return(c^2147483648^d^x)}if(F|a){if(c&1073741824){return(c^3221225472^d^x)}else{return(c^1073741824^d^x)}}else{return(c^d^x)}}
	function r(a,c,b){return(a&c)|((~a)&b)}
	function q(a,c,b){return(a&b)|(c&(~b))}
	function p(a,c,b){return(a^c^b)}
	function n(a,c,b){return(c^(a|(~b)))}
	function u(G,F,aa,Z,k,H,I){G=K(G,K(K(r(F,aa,Z),k),I));return K(L(G,H),F)}
	function f(G,F,aa,Z,k,H,I){G=K(G,K(K(q(F,aa,Z),k),I));return K(L(G,H),F)}
	function D(G,F,aa,Z,k,H,I){G=K(G,K(K(p(F,aa,Z),k),I));return K(L(G,H),F)}
	function t(G,F,aa,Z,k,H,I){G=K(G,K(K(n(F,aa,Z),k),I));return K(L(G,H),F)}
	function e(k){var G;var d=k.length;var c=d+8;var b=(c-(c%64))/64;var F=(b+1)*16;var H=Array(F-1);var a=0;var x=0;while(x<d){G=(x-(x%4))/4;a=(x%4)*8;H[G]=(H[G]|(k.charCodeAt(x)<<a));x++}G=(x-(x%4))/4;a=(x%4)*8;H[G]=H[G]|(128<<a);H[F-2]=d<<3;H[F-1]=d>>>29;return H}
	function B(c){var b="",d="",k,a;for(a=0;a<=3;a++){k=(c>>>(a*8))&255;d="0"+k.toString(16);b=b+d.substr(d.length-2,2)}return b}
	function J(b){b=b.replace(/\r\n/g,"\n");var a="";for(var k=0;k<b.length;k++){var d=b.charCodeAt(k);if(d<128){a+=String.fromCharCode(d)}else{if((d>127)&&(d<2048)){a+=String.fromCharCode((d>>6)|192);a+=String.fromCharCode((d&63)|128)}else{a+=String.fromCharCode((d>>12)|224);a+=String.fromCharCode(((d>>6)&63)|128);a+=String.fromCharCode((d&63)|128)}}}return a}
	var C=Array();var P,h,E,v,g,Y,X,W,V;var S=7,Q=12,N=17,M=22;var A=5,z=9,y=14,w=20;var o=4,m=11,l=16,j=23;var U=6,T=10,R=15,O=21;s=J(s);C=e(s);Y=1732584193;X=4023233417;W=2562383102;V=271733878;for(P=0;P<C.length;P+=16){h=Y;E=X;v=W;g=V;Y=u(Y,X,W,V,C[P+0],S,3614090360);V=u(V,Y,X,W,C[P+1],Q,3905402710);W=u(W,V,Y,X,C[P+2],N,606105819);X=u(X,W,V,Y,C[P+3],M,3250441966);Y=u(Y,X,W,V,C[P+4],S,4118548399);V=u(V,Y,X,W,C[P+5],Q,1200080426);W=u(W,V,Y,X,C[P+6],N,2821735955);X=u(X,W,V,Y,C[P+7],M,4249261313);Y=u(Y,X,W,V,C[P+8],S,1770035416);V=u(V,Y,X,W,C[P+9],Q,2336552879);W=u(W,V,Y,X,C[P+10],N,4294925233);X=u(X,W,V,Y,C[P+11],M,2304563134);Y=u(Y,X,W,V,C[P+12],S,1804603682);V=u(V,Y,X,W,C[P+13],Q,4254626195);W=u(W,V,Y,X,C[P+14],N,2792965006);X=u(X,W,V,Y,C[P+15],M,1236535329);Y=f(Y,X,W,V,C[P+1],A,4129170786);V=f(V,Y,X,W,C[P+6],z,3225465664);W=f(W,V,Y,X,C[P+11],y,643717713);X=f(X,W,V,Y,C[P+0],w,3921069994);Y=f(Y,X,W,V,C[P+5],A,3593408605);V=f(V,Y,X,W,C[P+10],z,38016083);W=f(W,V,Y,X,C[P+15],y,3634488961);X=f(X,W,V,Y,C[P+4],w,3889429448);Y=f(Y,X,W,V,C[P+9],A,568446438);V=f(V,Y,X,W,C[P+14],z,3275163606);W=f(W,V,Y,X,C[P+3],y,4107603335);X=f(X,W,V,Y,C[P+8],w,1163531501);Y=f(Y,X,W,V,C[P+13],A,2850285829);V=f(V,Y,X,W,C[P+2],z,4243563512);W=f(W,V,Y,X,C[P+7],y,1735328473);X=f(X,W,V,Y,C[P+12],w,2368359562);Y=D(Y,X,W,V,C[P+5],o,4294588738);V=D(V,Y,X,W,C[P+8],m,2272392833);W=D(W,V,Y,X,C[P+11],l,1839030562);X=D(X,W,V,Y,C[P+14],j,4259657740);Y=D(Y,X,W,V,C[P+1],o,2763975236);V=D(V,Y,X,W,C[P+4],m,1272893353);W=D(W,V,Y,X,C[P+7],l,4139469664);X=D(X,W,V,Y,C[P+10],j,3200236656);Y=D(Y,X,W,V,C[P+13],o,681279174);V=D(V,Y,X,W,C[P+0],m,3936430074);W=D(W,V,Y,X,C[P+3],l,3572445317);X=D(X,W,V,Y,C[P+6],j,76029189);Y=D(Y,X,W,V,C[P+9],o,3654602809);V=D(V,Y,X,W,C[P+12],m,3873151461);W=D(W,V,Y,X,C[P+15],l,530742520);X=D(X,W,V,Y,C[P+2],j,3299628645);Y=t(Y,X,W,V,C[P+0],U,4096336452);V=t(V,Y,X,W,C[P+7],T,1126891415);W=t(W,V,Y,X,C[P+14],R,2878612391);X=t(X,W,V,Y,C[P+5],O,4237533241);Y=t(Y,X,W,V,C[P+12],U,1700485571);V=t(V,Y,X,W,C[P+3],T,2399980690);W=t(W,V,Y,X,C[P+10],R,4293915773);X=t(X,W,V,Y,C[P+1],O,2240044497);Y=t(Y,X,W,V,C[P+8],U,1873313359);V=t(V,Y,X,W,C[P+15],T,4264355552);W=t(W,V,Y,X,C[P+6],R,2734768916);X=t(X,W,V,Y,C[P+13],O,1309151649);Y=t(Y,X,W,V,C[P+4],U,4149444226);V=t(V,Y,X,W,C[P+11],T,3174756917);W=t(W,V,Y,X,C[P+2],R,718787259);X=t(X,W,V,Y,C[P+9],O,3951481745);Y=K(Y,h);X=K(X,E);W=K(W,v);V=K(V,g)}
	var i=B(Y)+B(X)+B(W)+B(V);return i.toLowerCase()
};

/**
 * Creates a URL encoded string suitable for decoding
 * using the PHP urldecode() function.
 * Returns UTF-8 encoded data.
 */
YAHOO.CamelFW.FW.prototype.urlEncode = function( str )
{
	return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
}

/**
 * Returns the parameter specified in 'param'
 * from the URL specified in 'url'.
 */
YAHOO.CamelFW.FW.prototype.getUrlParam = function( url, param ) {
	
	param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	var regexS = "[\\?&]"+param+"=([^&#]*)";
	var regex = new RegExp( regexS );
	var results = regex.exec( url );
	if ( results == null ) {
	
		return "";
	}
	else {
		
		return results[1];
	}
}


/**
 * Decodes a URL encoded by the PHP urlencode() function.
 * Expects UTF-8 encoded data.
 */
YAHOO.CamelFW.FW.prototype.urlDecode = function( str )
{
	return decodeURIComponent(str).replace(/\+/g, '%20');
}


/**
 * Format currency in euro.
 * For use in datatables.
 * 
 * @param {Object} elCell
 * @param {Object} oRecord
 * @param {Object} oColumn
 * @param {Object} oData
 */
YAHOO.CamelFW.FW.prototype.currencyFormatter = function( elCell, oRecord, oColumn, oData ) {
	
	// Cast to int
	oData = oData * 1;
	// Round to two decimal places
	var n = oData.toFixed( 2 );
	var d = "&euro; " + n.toString().replace( ".", "," );
	elCell.innerHTML = d;
};


/**
 * Validate numbers are positive (non-negative) integers.
 * For use in datatables.
 * 
 * @param {Object} oData
 */
YAHOO.CamelFW.FW.prototype.validatePositiveInteger = function( oData ) {
	
	// Cast to number
	var number = oData * 1;
	if ( number == 0 )
	{
		return "";
	}
	
	// Check the number only contains digits
	var isInteger = /^\d+$/.test( number );
	if ( isInteger )
	{
		return number;
	}
	else
	{
		return undefined;
	}
}


/**
 * Makes the specified datatable row flash
 * 
 * @param {Datatable object}	oDataTable		The datatable object that contains the row the flash
 * @param {Record object}		oRecord			The record in the datatable to flash
 * @param {integer}				count			[optional] The number of times to flash
 * @param {integer}				flashDuration	[optional] The duration of the flash and intervals
 */
YAHOO.CamelFW.FW.prototype.flashDataTableRow = function( oDataTable, oRecord, count, flashDuration ) {
	
	if ( count == undefined || count == 0 ) count = 1;
	if ( flashDuration == undefined || flashDuration == 0 ) flashDuration = 250;
	
	var tr = oDataTable.getTrEl( oRecord );
	oDataTable.highlightRow( tr );
	YAHOO.lang.later( flashDuration, this, function() {
		
		oDataTable.unhighlightRow( oRecord );
		
		if ( count > 1 ) {
			
			count--;
			YAHOO.lang.later( flashDuration, this, this.flashDataTableRow, [ oDataTable, oRecord, count, flashDuration ]);
		}
	});
}


/**
 * YUI doesn't assign a class to the TABLE tag of a datatable.
 * This method adds a default class 'camelTable' and a specific
 * class identified by the 'sClass' variable to the TABLE tag.
 * 
 * Example call:
 *   oDataTable.subscribe( "postRenderEvent", this.onDatatableRenderComplete, [oDataTable, "mySpecificClass"] );
 * 
 * @param {Object} e		event
 * @param {Object} oArgs	[0] = datatable object
 * 							[1] = specific class to apply
 */
YAHOO.CamelFW.FW.prototype.onDatatableRenderComplete = function( e, oArgs ) {
	
	var tableEl = oArgs[0].getTableEl();
	var sClass = "camelTable " + oArgs[1];
	YAHOO.util.Dom.addClass( tableEl, sClass );
}

