/**
 * Forms Framework Javascript Handling Object
 */

var ff = (function () {
// private vars
var loaded_js = [];
var loaded_css = [];

var plugins = [];
var plugins_loads = [];
var plugins_inits = [];

//var ajax_darkener = null;

function pluginInit(id) {
	if (plugins_inits[id] !== undefined) {
		if (plugins_inits[id].length) {
			for (i = 0; i < plugins_inits[id].length; i++) {
				if(plugins[id] === true) {
					plugins_inits[id][i]();
				}
			}
			plugins_inits[id] = [];
		}
	}
}

function pluginInitLoad(id) {
	if (plugins_loads[id] !== undefined) {
		if (plugins_loads[id].length) {
			for (i = 0; i < plugins_loads[id].length; i++) {
			if(plugins[id] === true)
				plugins_loads[id][i]();
			}
			plugins_loads[id] = [];
		}
	}
	pluginInit(id);
}

var that = { // publics

"site_path"		: undefined,
"theme"			: undefined,
"language" 		: undefined, 
"layer" 		: undefined, 
"phpsession"	: {
	"name"			: undefined,
	"value"			: undefined
},
"struct"		: [],

"initFF" : function (params) {
	that.site_path				= params.site_path;
	that.theme					= params.theme;
	that.page_path 				= params.page_path;
	that.language 				= params.language;
	that.layer 					= params.layer;
	that.phpsession.name		= params.phpsession.name;
	that.phpsession.value		= params.phpsession.value;
	that.struct					= params.struct;
	that.js_path = that.site_path + '/themes/' + that.theme + '/javascript';

	if (params.libs !== undefined) {
		for (i in params.libs) {
			that.pluginLoad(i, that.site_path + params.libs[i]);
		}
	}
},

"extend" : function () {
	jQuery.extend.apply(true, ff, arguments);
},

"pluginInitExec" : function(id, callback) {
	if (callback !== undefined)
		callback();

	pluginInitLoad(id);
},

"pluginLoad" : function (id, source, callback) {
	if (plugins[id] === undefined) {
		plugins[id] = false;
		jQuery.getScript(source, function (data, textStatus) {
			if(textStatus == "success") {
				plugins[id] = true;
				setTimeout("ff.pluginInitExec('" + id + "', " + callback + ")", 0);
			}
		});
	} else if (callback !== undefined) {
		if (plugins[id] === false) {
			that.pluginAddInitLoad(id, callback);
		} else {
			setTimeout("ff.pluginInitExec('" + id + "', " + callback + ")", 0);
		}
	}
},

"pluginAddInitLoad" : function (id, callback) {
	if (plugins[id] !== true) {
		if (plugins_loads[id] === undefined)
			plugins_loads[id] = [];

		plugins_loads[id].push(callback);
	}
	else 
		callback();
},

"pluginAddInit" : function (id, callback) {

	if (plugins[id] !== true) {
		if (plugins_inits[id] === undefined)
			plugins_inits[id] = [];

		plugins_inits[id].push(callback);
	}
	else 
		callback();
},

"injectCSS" : function (source) {
	if (loaded_css[source] !== undefined)
		return;
	
	loaded_css[source] = true;

	var css = document.createElement('link');
	css.setAttribute('rel', 'stylesheet');
	css.setAttribute('href', source);
	document.getElementsByTagName('head')[0].appendChild(css);
},

"doAjax" : function (component, injectid, callback, url, fields) {
	jQuery.blockUI({message: '<h1 class="block-loader"></h1>', css: {border:'0', left:'45%', backgroundColor:'transparent'}, overlayCSS: {backgroundColor: '#FFF', opacity: 0.4}}); 
	
	var form = jQuery("#frmMain");
	if (fields === undefined)
		fields = jQuery(":input", form).not("input:checkbox:not(:checked)");
	
	var parsedurl = (url ? url : document.location.href);

	fields.push(
		{name: "XHR_COMPONENT", value: component}
	);

	jQuery.ajax({
		  url: parsedurl
		, async: true
		, data: fields
		, type: "POST"
		, dataType: "json"
		, success: ff.onSuccess
		, mydata: {"component" : component, "injectid" : injectid, "callback" : callback}
	});
},

"onSuccess" : function (data, textStatus) {
	var component = this.mydata.component;
	var callback = this.mydata.callback;
	var injectid = (this.mydata.injectid ? this.mydata.injectid : this.mydata.component);

	jQuery.unblockUI();

	jQuery("#" + injectid).replaceWith(data[component]["html"]);

	if (data[component]["js"] !== undefined)
		jQuery(document).append(data[component]["js"]);

	if (ff.struct[component].type == "ffGrid_base") {
		ff.ffPageNavigator.updateButtons(component, data[component]["rows"]);
	}

	if (callback !== undefined)
		callback();

	return;
	
	if (data.success) {
		alert("boh!");
	} else {
		if (data.output) {
			alert("uhm");
			jQuery("#" + component).html(data.output);
		} else if (data.url) {
			document.location.href = data.url;
		}
	}
},

"addLoadEvent" : function (func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			if (oldonload) {
				oldonload();
			}
			func();
		}
	}
},

"submitProcessKey" : function (e, button) {
    if (null == e)
        e = window.event;
    if (e.keyCode == 13)  {
        document.getElementById(button).click();
        return false;
    }
},

"ffPage" : {},

"ffGrid" : {},

"ffRecord" : {},

"ffDetails" : {},

"ffField" : {},

"ffPageNavigator" : {},

"google" : {}

}; // publics' end

return that;

// code' end.
})();