/*js framework library 1.0.12*/ 

//--------------------------------------------------------------------------
// jump to
//--------------------------------------------------------------------------
function f_jump(l)
{
	if(!is_null(l)) document.location.href = l;
	return false;
}

//--------------------------------------------------------------------------
// Write framework error
//--------------------------------------------------------------------------
function f_error(error, mode)
{
	switch (mode)
	{
		case 'syserror' : var t = 'fSyserrorStack';
		case 'message'	: var t = 'fErrorStack';
		default 		: var t = 'fMessageStack';
	}
	var elt = document.getElementById(t);
	var aerror = mode.toUpperCase() + ': ' + f_str_strip_html_tags(error); 
	(elt==null || elt.innerHTML==null) ? alert(aerror) : elt.innerHTML = elt.innerHTML  + error;
}


//--------------------------------------------------------------------------
// Opens centered popup window
//--------------------------------------------------------------------------
function f_popup(Url, PopupName, dl_width, dl_height, scrollbars, resizable){
	
	if(!scrollbars){scrollbars='no';}
	else{scrollbars='yes';}
	
	if(!resizable){resizable='no';}
	else{resizable='yes';}
	
	var x	= Math.round((screen.availWidth  - dl_width) / 2);
	var y	= Math.round((screen.availHeight - dl_height) / 2);

	window.open(Url,PopupName,"left=" + x + ",top=" + y + ", scrollbars="+scrollbars+",resizable="+resizable+",width="+dl_width+",height="+dl_height+",menubar=no");
	return false;
}

//--------------------------------------------------------------------------
// Strip HTML tags from string
//--------------------------------------------------------------------------
function f_str_strip_html_tags(str)
{
	var re= /<\S[^>]*>/g; 
	return str.replace(re,"");
}




//--------------------------------------------------------------------------
// Validate
// req|message
//--------------------------------------------------------------------------
function f_validate(f, msg_prefix, msg_suffix, colorNormal, colorError){

	if(is_null(colorNormal)) colorNormal = '#FFFFFF';
	if(is_null(colorError)) colorError = '#FFC3B5';

	if(is_null(msg_prefix)) msg_prefix = 'Error: ';
	if(is_null(msg_suffix)) msg_suffix = '';

	var errors = new Array();
	var first_error = false;
	var num_errors = 0;


	for (var i = 0; i < f.elements.length; i++) {
	//for (var i = 0; i < document.forms[f.name].elements.length; i++) {
		
		var e = f.elements[i].id;
		
		if(is_null(e)) continue;
		
		var info = new Array();

		d = f_validate_get_elt_info(e);

		if(d['check'] == 'not_req') continue;

		switch(d['type'])
		{
			//----------
			case 'text':
				if(!fv_string(d['value'], d['min'], d['max'])){
					errors[num_errors++] = d['error'];
					f_set_bgcolor(ge(e), colorError);
					first_error = !first_error ? e : first_error;
				}
				else{
					f_set_bgcolor(ge(e), colorNormal);
				}
			break;
			//----------
			case 'select':
				if(!select_have_selected(ge(e))){
					errors[num_errors++] = d['error'];
					f_set_bgcolor(ge(e), colorError);
					first_error = !first_error ? e : first_error;
				}
				else{
					f_set_bgcolor(ge(e), colorNormal);
				}
			break;
		}

	}
	
	if (errors.length >0)
	{
		var str_error = '';
		for( var i = 0; i<errors.length; i++){
			str_error = str_error + " =  " + errors[i] + "\n";
		}
		str_error = msg_prefix + "\n================================\n\n" + str_error + "\n================================\n" + msg_suffix;
		f_field_focus(ge(first_error));
		alert(str_error);
		return false;
	}

	return true;	
}


//--------------------------------------------------------------------------
// validate string
//--------------------------------------------------------------------------
function fv_string(str, min, max){
	str = trim(str);
	if(is_null(str)) return false;
	if(!is_null(min) && str.length < min) return false;
	if(!is_null(max) && str.length > max) return false;
	return true;
}



//--------------------------------------------------------------------------
//	parse alt attribute and return an array with info
//  error_message|validate_rule|param:value|param:value
//--------------------------------------------------------------------------
function f_validate_get_elt_info(e){

	if(is_null(e)){
		alert('Error: element '+ e + ' is not defined.');
		return false;
	}
	var data = new Array();

	data['id']		= e;
	data['name']	= gn(e);
	data['type']	= gt(e);
	data['value']	= gv(e);
	data['validate']= f_validate_get_rule(e);
	
	if(is_null(data['validate'])){
		data['error'] = '';
		data['check'] = 'not_req';
		return data;
	}

	rule = new String(data['validate']);
	res = rule.split('|');
	data['error'] = is_null(res[0]) ? alert('Message not defined for '+e) : trim(res[0]);

	if(is_null(res[0])) data['check'] = 'not_req';

	if(is_null(res[1]) && !is_null(res[0])) data['check'] = 'req';

	for(var i=2; i<=res.length; i++)
	{
		if(!is_null(res[i]))
		{
			var tmp = new Array();
			tmp = res[i].split(':');
			if(!is_null(tmp[0]) && !is_null(tmp[1]))
			{
				data[tmp[0]] = tmp[1];
			}
		}
	}

	return data;
}


//--------------------------------------------------------------------------
// Get validate rule
//--------------------------------------------------------------------------
function f_validate_get_rule(e){
	 rule = (ge(e).getAttribute('validate'));
	 return !is_null(rule) ? rule : null;
}


//--------------------------------------------------------------------------
// Is not defined, null, or empty
//--------------------------------------------------------------------------
function is_null(v){
	return  (v == 'undefined' || v == null || trim(v) == '') ? true : false;
}

//--------------------------------------------------------------------------
// Is empty
//--------------------------------------------------------------------------
function is_empty(v){
	return (trim(v) == '') ? true : false;
}


//--------------------------------------------------------------------------
// Get Element By ID
//--------------------------------------------------------------------------
function ge(e){
	return document.getElementById(e);
}

//--------------------------------------------------------------------------
// Get Element Type
//--------------------------------------------------------------------------
function gt(e){
	var t = ge(e).type;
	if(t == "textarea") return "text";
	if(t == "select-one" || t == "select-multiple") return "select";
	return t;
}


//--------------------------------------------------------------------------
// Get Element Alt attribute
//--------------------------------------------------------------------------
function ga(e){
	return ge(e).getAttribute('alt');
}

//--------------------------------------------------------------------------
// Get Element Name
//--------------------------------------------------------------------------
function gn(e){
	return ge(e).name;
}

//--------------------------------------------------------------------------
// Get Element Value
//--------------------------------------------------------------------------
function gv(e){
	switch(gt(e))
	{
		case 'select':
			return select_get_selected_values(e);
		break;
		default: //text, textarea, hidden, button
			return ge(e).value;
		break;
	}
	
}

//--------------------------------------------------------------------------
// Trim string
//--------------------------------------------------------------------------
function trim(s){
  return s.replace(/^\s+/g, '').replace(/\s+$/g, '');	
}


//--------------------------------------------------------------------------
// Change bacground color
//--------------------------------------------------------------------------
function f_set_bgcolor(obj, color){
	if(typeof obj != 'undefined') obj.style.backgroundColor = color;
}


//--------------------------------------------------------------------------
// Focus
//--------------------------------------------------------------------------
function f_field_focus(obj){
	if(obj != null && typeof obj != 'undefined') obj.focus();
}


//--------------------------------------------------------------------------
// SELECT :: select option by index
//--------------------------------------------------------------------------
function select_select_option_by_index(box, index)
{
	obj = (typeof box =='object') ? box : ge(box);
	obj.options[index].selected = true;
}


//--------------------------------------------------------------------------
// SELECT :: select option by value
//--------------------------------------------------------------------------
function select_select_option_by_value(box, value)
{
	obj = (typeof box =='object') ? box : ge(box);
	index = select_get_index_by_value(box, value);
	select_select_option_by_index(box, index);
}


//--------------------------------------------------------------------------
// SELECT :: get value by index
//--------------------------------------------------------------------------
function select_get_value_by_index(box, index)
{
	obj = (typeof box =='object') ? box : ge(box);
	return obj.options[index].value;
}


//--------------------------------------------------------------------------
// SELECT :: get index by value
//--------------------------------------------------------------------------
function select_get_index_by_value(box, value)
{
	obj = (typeof box =='object') ? box : ge(box);
    for( var i = 0; i < obj.options.length; i++ )
		if(obj.options[i].value == value) return i;
	return null;
}

//--------------------------------------------------------------------------
// SELECT :: select all
//--------------------------------------------------------------------------
function select_select_all(box)
{
	obj = (typeof box =='object') ? box : ge(box);
    for( var i = 0; i < obj.options.length; i++ )
		obj.options[i].selected = true;
}

//--------------------------------------------------------------------------
// SELECT :: deselect all
//--------------------------------------------------------------------------
function select_deselect_all(box)
{
	obj = (typeof box =='object') ? box : ge(box);
    for( var i = 0; i < obj.options.length; i++ )
		obj.options[i].selected = false;
}

//--------------------------------------------------------------------------
// SELECT :: is have selected
//--------------------------------------------------------------------------
function select_have_selected(s)
{
	var a = new Array();
	a = select_get_selected_values(s);
	return (a.length > 0) ? true : false;
}


//--------------------------------------------------------------------------
// SELECT :: get selected values
//--------------------------------------------------------------------------
function select_get_selected_values (s) 
{
	obj = (typeof s =='object') ? s : ge(s);
	var r = new Array();
	for (var i = 0; i < obj.options.length; i++)
		if (obj.options[i].selected && obj.options[i].value!='')
			r[r.length] = obj.options[i].value;
	return r;
}

//--------------------------------------------------------------------------
// SELECT :: get selected texts
//--------------------------------------------------------------------------
function select_get_selected_texts (s) 
{
	obj = (typeof s =='object') ? s : ge(s);
	var r = new Array();
	for (var i = 0; i < obj.options.length; i++)
		if (obj.options[i].selected)
			r[r.length] = obj.options[i].text;
	return r;
}


//--------------------------------------------------------------------------
// SELECT :: get selected indexes
//--------------------------------------------------------------------------
function select_get_selected_indexes (s) 
{
	obj = (typeof s =='object') ? s : ge(s);
	var r = new Array();
	for (var i = 0; i < obj.options.length; i++)
		if (obj.options[i].selected)
			r[r.length] = i;
	return r;
}


//--------------------------------------------------------------------------
// SELECT :: delete all options
//--------------------------------------------------------------------------
function select_delete_all_options (s) 
{
	obj = (typeof s =='object') ? s : ge(s);
	obj.options.length = 0;
}



//--------------------------------------------------------------------------
// SELECT :: add option
//--------------------------------------------------------------------------
function select_add_option (s, value, text) 
{
	obj = (typeof s =='object') ? s : ge(s);
	opt = new Option(text, value);
	obj.options[obj.options.length] = opt;
}

//--------------------------------------------------------------------------
// SELECT :: add options from array
//--------------------------------------------------------------------------
function select_add_options (s, arr) 
{
	for(var i in arr)
		select_add_option (s, i, arr[i]);
}


//--------------------------------------------------------------------------
// SELECT :: delete option by value
//--------------------------------------------------------------------------
function select_delete_option_by_value (s, value) 
{
	obj = (typeof s =='object') ? s : ge(s);
	index = select_get_index_by_value(s, value);
	obj.options[index] = null;
}


//--------------------------------------------------------------------------
// SELECT :: delete option by index
//--------------------------------------------------------------------------
function select_delete_option_by_index (s, index) 
{
	obj = (typeof s =='object') ? s : ge(s);
	obj.options[index] = null;
}


//--------------------------------------------------------------------------
// * CHECKBOX :: check/uncheck all
// <input type="checkbox" name="checkall" onclick="checkbox_check_uncheck_all(this,'selected[]')" value="1">
//--------------------------------------------------------------------------
function checkbox_check_uncheck_all(box, obj){
	var f = box.form.name;
	var o =document.forms[f].elements[obj];
	var b = document.forms[f].elements[box.name];
	if(b.value==1){
		var c = true;
		b.value=0;
	}		
	else{
		var c = false;
		b.value=1;
	}
	b.checked = c;
	
	if(typeof o !='undefined'){
		for (var i = 0; i < o.length; i++) {
			o[i].checked= c;
		}
	}
}



//var re		= /^\w[\w\d]+(\.[\w\d]+)*@\w[\w\d]+(\.[\w\d]+)*\.[a-z]{2,7}$/i
//--------------------------------------------------------------------------
// Dump variable
//--------------------------------------------------------------------------
function dump(obj, parent) {
   for (var i in obj) {
	  if (parent) { var msg = parent + "." + i + "\n" + obj[i]; } else { var msg = i + "\n" + obj[i]; }
	  if (!confirm(msg)) { return; }
	  if (typeof obj[i] == "object") { 
		 if (parent) { dump(obj[i], parent + "." + i); } else { dump(obj[i], i); }
	  }
   }
}