/** DIGIVISION CLIENT SYSTEM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *	Des: 	Digiclientsystem core support for developers and speed-up Website
 *			maked by Digivision company.
 *	Usage:	- Make many function useful into one formular.
 *			- Speed-up loading website script.
 *			- On-demaind loading plugin jQ.
 *			- Full support info browser for developer.
 *			- Continue upgrade.
 *	Comp:	Tested good on IE 6 7 8 9 + | Chrome+ | Firefox 3.*.
 *	Info:	Digivision.,jsc - Http://digivision.com.vn
 *			office@digisoft.com.vn
 * 			2011 - @ Rue - member of Digivision company.
 * 	Ver:	3.0.20110209
 */
 
/* DECLARED GLOBAL VARIABLE */
/**
 * @_digiplugin:	Follow using plugin (default: true) [boolean].
 * @_digipluginpart:	url plugin link file [string]. 
 * */
var _digiplugin = true;
var plc;

/* BROWSER DETECT CODE - many thanks to QuirksMode website
 * http://www.quirksmode.org/js/detect.html */
var BrowserDetect = {
		init: function () {
			this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
			this.version = this.searchVersion(navigator.userAgent)
				|| this.searchVersion(navigator.appVersion)
				|| "an unknown version";
			this.OS = this.searchString(this.dataOS) || "an unknown OS";
		},
		searchString: function (data) {
			for (var i=0;i<data.length;i++)	{
				var dataString = data[i].string;
				var dataProp = data[i].prop;
				this.versionSearchString = data[i].versionSearch || data[i].identity;
				if (dataString) {
					if (dataString.indexOf(data[i].subString) != -1)
						return data[i].identity;
				}
				else if (dataProp)
					return data[i].identity;
			}
		},
		searchVersion: function (dataString) {
			var index = dataString.indexOf(this.versionSearchString);
			if (index == -1) return;
			return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
		},
		dataBrowser: [
			{
				string: navigator.userAgent,
				subString: "Chrome",
				identity: "Chrome"
			},
			{ 	string: navigator.userAgent,
				subString: "OmniWeb",
				versionSearch: "OmniWeb/",
				identity: "OmniWeb"
			},
			{
				string: navigator.vendor,
				subString: "Apple",
				identity: "Safari",
				versionSearch: "Version"
			},
			{
				prop: window.opera,
				identity: "Opera"
			},
			{
				string: navigator.vendor,
				subString: "iCab",
				identity: "iCab"
			},
			{
				string: navigator.vendor,
				subString: "KDE",
				identity: "Konqueror"
			},
			{
				string: navigator.userAgent,
				subString: "Firefox",
				identity: "Firefox"
			},
			{
				string: navigator.vendor,
				subString: "Camino",
				identity: "Camino"
			},
			{		// for newer Netscapes (6+)
				string: navigator.userAgent,
				subString: "Netscape",
				identity: "Netscape"
			},
			{
				string: navigator.userAgent,
				subString: "MSIE",
				identity: "Explorer",
				versionSearch: "MSIE"
			},
			{
				string: navigator.userAgent,
				subString: "Gecko",
				identity: "Mozilla",
				versionSearch: "rv"
			},
			{ 		// for older Netscapes (4-)
				string: navigator.userAgent,
				subString: "Mozilla",
				identity: "Netscape",
				versionSearch: "Mozilla"
			}
		],
		dataOS : [
			{
				string: navigator.platform,
				subString: "Win",
				identity: "Windows"
			},
			{
				string: navigator.platform,
				subString: "Mac",
				identity: "Mac"
			},
			{
				   string: navigator.userAgent,
				   subString: "iPhone",
				   identity: "iPhone/iPod"
		    },
			{
				string: navigator.platform,
				subString: "Linux",
				identity: "Linux"
			}
		]

	};
	BrowserDetect.init();


/* CONFIG SYSTEM FOR JS */
/**
 * @digic: Object name.
 * @plugin: follow config using plugin jQ (default: true) [boolean].
 * @pluginpart: config url plugin part file jQ (default: '') [string] (xml file).
 */
var digic = function(options) {
	var defaults = {
		plugin: true,
		pluginpart: 'xmlpluginpart.xml',
		checkbrowser: true
	};
	var zip = $.extend(defaults, options);
	_digipluginpart = zip.pluginpart;
	if(zip.checkbrowser == true) check();
	function check() {
		var dasboad = '<div id="dasboad"><h2 id="dastitle">Digi info browser</h2></div>';
		$("body").append(dasboad);
		$("body #dasboad").css({
			'position':'absolute',
			'z-index':'99999',
			'top':'0',
			'left':'0',
			'border':'solid 1px #999',
			'background-color':'#ccc',
			'padding':'5px',
			'width':'500px'
		}).hide();
		$("body #dasboad #dastitle").css({
			'background-color':'brown',
			'display':'block',
			'color':'white',
			'font-weight':'bold',
			'text-align':'center',
			'padding':'5px',
			'font-size':'10px',
			'margin-bottom':'10px'
		});
		function addline(_label, _value) {
			$("#dasboad").append('<p>'+_label+': <span style="background-color:white; font-size:11px; color:red; padding:5px;">'+_value+'</span></p><br>');
		};
		addline('Name Browser', BrowserDetect.browser);
		addline('Version Browser', BrowserDetect.version);
		addline('Operation system', BrowserDetect.OS);
		$("#dasboad").fadeIn('slow', function() {
			setInterval(function() {
				$("#dasboad").fadeOut('normal');
			}, 3000);
		});
	}
	if (zip.plugin == true)
		$.ajax({
			url:_digipluginpart,
			async:false,	
			cache:true,
			dataType:'xml',
			success: function(data) {
				plc = $(data);
			}
		});
};

/* FUNCTION BUILD-ON SYSTEM */
/**	 
 * @digif : Object name.
 * @sign :	add class(attribute) into element list.
 * @split :	wrap amount of elements of html tree.
 * @equal :	make list of elements html to become same height(width).
 * @browser : 	check name - version of browser.
 * @os : check name of Operation system user.
 * @cssset : add dynamic css file.
 * @jsset : add dynamic css file.
 */
var digif = {
	sign: function(contain, kind, format, signname, signvalue) {
		var $units = $(contain).find(" > :nth-child("+format+")");
		if(kind == 'class')
			$units.addClass(signname);
		else if(kind == 'attr')
			$units.attr(signname, signvalue);
		else _debug('sign function ['+contain+'] error');
	},
	
	split: function(contain, num, format) {
		var $units = $(contain).find(" > :nth-child(1n)");
		var _length = $units.length;
		for (i=0; i<_length; i++) {
			$units.slice(i*num, i*num+num).wrapAll(format);
		}
	},
	
	equal: function(contain, direct, sameclass) {
		if(sameclass != undefined) var $units = $(contain).find(sameclass);
		else var $units = $(contain).find(" > :nth-child(1n)");
		var _length = $units.length;
		var max = 0;
		for (i=0; i<_length; i++) {
			var temp = eval('$units.eq(i).'+direct+'()');
			if(temp > max) max = temp; 
		}
		eval('$units.'+direct+'(max)');
	},
	
	browser: function(request) {
		var value = new String();
		switch(request) {
		case 'name':	value = BrowserDetect.browser; break;
		case 'ver':	value = BrowserDetect.version; break;
		case 'all':	value = BrowserDetect.browser+' '+BrowserDetect.version; break;
		default: _debug('browser function error'); break;
		}
		return value;
	},
	
	os: function() {
		var value = new String();
		value = BrowserDetect.OS;
		return value;
	},
	
	cssset: function(list, pos) {	
		if(BrowserDetect.browser == 'Explorer' && parseInt(BrowserDetect.version) < 9 ) {
			var liststring = new String();
			for (x in list) {
				liststring += '<link type="text/css" rel="stylesheet" href="'+list[x]+'" />';
			}
			$(pos).after(liststring);
		} else {
			var _length = list.length;
			var liststring = new String();
			for (i=0; i<_length; i++) {
				liststring += '@import "'+list[i]+'"; ';
			}
			if ($('#addoncss').length == 0) {
				$(pos).after('<style id="addoncss"></style>');
			}
			$("#addoncss").append(liststring);		
		}
	},
	
	jsset: function(list, func) {
		var _length = list.length;
		var count = 0;
		check();
		function check() {
			if (count < _length-1) {
				count++;
				show();
			} 
			else {
				show(true);
			}
		}
		function show(checked) {
			if (checked == true) {
				$.ajax({
					url: list[count],
					dataType: 'script',
					success: func != undefined ? func() : false 	  
				});
			} else {
				$.ajax({
					  url: list[count],
					  dataType: 'script'
					});
				check();
			}
		}
	}
};

/* CALL - RECALL PLUGIN SYSTEM */
/** 
 * @digip : Object Name.
 * @regs : registion name of plugin need to use.
 * @sup : make support plugin name.
 * @call : make a call in the fist active.
 * @recall : make recall plugin on event. 
 */
var gblist = new Object();
var digip = {
	regs: function(name) {
			var _length = name.length; 
			$.each(name, function(index, value) {
				var $source = plc.find('pack[name="'+value+'"]');							
				var cssdata = $source.attr('csspart');
				if (cssdata != undefined) 
					digif.cssset([cssdata], 'head link:first');
				var _check = $source.attr('form');
				_check = _check.match(/(?:[a-z])[a-zA-Z]*(?=\()/);
				if (eval('jQuery.fn.'+_check)) {
					active($source.attr('name'));
				} else { 
					$.getScript($source.attr('jspart'), function() {
						active($source.attr('name'));
					});
				}
			});
			function active(_name) {															
				var clist = gblist[_name]; 														
				if(clist != undefined)
					for (i in clist) {
						eval(clist[i]);
					}
			}
	},
	call: function(pl, contain, param) {
		var $source = plc.find('pack[name="'+pl+'"]');
		var format = $source.attr('form');
		format = format.replace(/\*/,'\''+contain+'\'');
		var params = new String();
		for (var x in param) { 
			if(typeof(param[x]) == 'string')
				params += x+': \''+param[x]+'\', ';
			else if(typeof(param[x]) == 'object')
				params += x+': {'+printobject(param[x])+'}, ';
			else params += x+': '+param[x]+', ';
		}
		function printobject(obj) {
			var returnstring = '';
			for(var y in obj) {
				if(typeof(obj[y]) == 'string')
					returnstring += y+': \''+obj[y]+'\', ';
				else if(typeof(obj[y]) == 'object')
					returnstring += y+': '+printobject(obj[y])+', ';
				else returnstring += y+': '+obj[y]+', ';
			}
			returnstring = returnstring.substring(0, returnstring.length-2);
			return returnstring;
		};
		params = params.substring(0, params.length-2);
		format = format.replace(/\*/,'{'+params+'}')+';';
		if (gblist[pl] == undefined)
			eval('gblist.'+pl+'=[]');
			eval('gblist.'+pl+'.push(format)'); 													
	},
	
	recall: function(pl, contain, param, func) {
		var $source = plc.find('pack[name="'+pl+'"]');
		var format = $source.attr('form');								
		var checking = format.match(/(?:[a-z])[a-zA-Z]*(?=\()/);
		format = format.replace(/\*/,'contain');
		var params = new String();
		for (var x in param) { 
			if(typeof(param[x]) == 'string')
				params += x+': \''+param[x]+'\', ';
			else if(typeof(param[x]) == 'object')
				params += x+': {'+printobject(param[x])+'}, ';
			else params += x+': '+param[x]+', ';
		}
		function printobject(obj) {
			var returnstring = '';
			for(var y in obj) {
				if(typeof(obj[y]) == 'string')
					returnstring += y+': \''+obj[y]+'\', ';
				else if(typeof(obj[y]) == 'object')
					returnstring += y+': '+printobject(obj[y])+', ';
				else returnstring += y+': '+obj[y]+', ';
			}
			returnstring = returnstring.substring(0, returnstring.length-2);
			return returnstring;
		};
		params = params.substring(0, params.length-2);
		format = format.replace(/\*/,'{'+params+'}');
		var looped = setInterval(function() {
			if (eval('jQuery.fn.'+checking)) {
				eval(format); clearInterval(looped);
				if( func != undefined) func();
			}
		}, 1000);
	}
};
