(function($){
  $.fn.ScrollCenter = function(options) {
    var pos = {
      sTop : function() {
        return window.pageYOffset || document.documentElement && document.documentElement.scrollTop ||	document.body.scrollTop;
      },
      wHeight : function() { 
        return window.innerHeight || document.documentElement && document.documentElement.clientHeight || document.body.clientHeight;
      },
      sLeft	: function(){
      	return window.pageXOffset || document.documentElement && document.documentElement.scrollLeft ||	document.body.scrollLeft;
      },
      wWidth : function(){
      	return window.innerWidth || document.documentElement && document.documentElement.clientWidth || document.body.clientWidth;
      }
    };
    return this.each(function(index) {
      if (index == 0) {
        var $this = $(this);
        var elHeight = $this.height();
        var elWidth = $this.width();
		    var elTop = pos.sTop() + (pos.wHeight() / 2) - (elHeight / 2);
		    var elLeft = pos.sLeft() + (pos.wWidth() / 2) - (elWidth / 2);
      
		/*
		$this.css({
          position: 'absolute',
          marginTop: '0',
          top: elTop,
          left:elLeft
        });*/
        
         $this.animate({ 
	          marginTop: '0',
	          top: elTop,
	          left:elLeft
	      }, "fast","swing" );

      }
      
    });
  };

})(jQuery);

if (Goingup == null){
	var Goingup = {};
}

/* this is predefined form options object. it is empty here.
 * this object should be used in case we need predefine form options which created on the fly
 * we can define this options on any diferent scripts
 * 
 * usually thats uses for forms that created on fly. 
 * this predefained options will be added(not replaced) to provided form options  
 *  
 * example:
 * Goingup.formOptions['fmDeleteAlias'] = {
		callAfterSuccess:function(data){
			if (data.aliases_list_html){
				jQuery('#list_rows').html(data.aliases_list_html);
			}
			if (data.aliases_list_totals){
				jQuery('#total_pageviews').html(Goingup.number_format(data.aliases_list_totals.pageviews));
				jQuery('#total_visitors').html(Goingup.number_format(data.aliases_list_totals.visitors));
				jQuery('#total_keywords').html(Goingup.number_format(data.aliases_list_totals.keywords));
			}
		}
		
	};
	Goingup.formOptions['fmAddAlias'] = {
		callAfterSuccess:function(data){
			if (data.aliases_list_html){
				jQuery('#list_rows').html(data.aliases_list_html);
			}
			if (data.aliases_list_totals){
				jQuery('#total_pageviews').html(Goingup.number_format(data.aliases_list_totals.pageviews));
				jQuery('#total_visitors').html(Goingup.number_format(data.aliases_list_totals.visitors));
				jQuery('#total_keywords').html(Goingup.number_format(data.aliases_list_totals.keywords));
			}
		}
	};
 * 
 * */
Goingup.formOptions = {
	
};

Goingup.popUpWin=0;
Goingup.popUpWindow = function(URLStr, left, top, width, height,scrollbars){
	var scrollbars = typeof scrollbars != 'undefined'?parseInt(scrollbars):0;
	
  if(Goingup.popUpWin)  {
    if(!Goingup.popUpWin.closed) Goingup.popUpWin.close();
  }
  Goingup.popUpWin = open(URLStr, 'popUpWin', 'toolbar=0,location=0,directories=0,status=0,menubar=no,scrollbars='+scrollbars+',resizable=0,copyhistory=0,width='+width+',height='+height+',left='+left+', top='+top+',screenX='+left+',screenY='+top+'');
}

Goingup.loadScript = function(url){
	var e = document.createElement("script");
	e.src = url;
	e.type="text/javascript";
	document.getElementsByTagName("head")[0].appendChild(e); 
};
Goingup.loadCSS = function(url){
	var oLink = document.createElement("link");
	oLink.href = url;
	oLink.rel = "stylesheet";
	oLink.type = "text/css";
	document.getElementsByTagName("head")[0].appendChild(oLink);
};

Goingup.parseUrlParams = function (string_url_params){
	var tmp = string_url_params.split('&');
	var res = {};
	for (var i=0; i<tmp.length; i++){
		var _tmp = tmp[i].split('=');
		res[_tmp[0]] = _tmp[1]; 
	}
	return res;
};

Goingup.ajaxForms = function(context){
	jQuery('form.__ajax__',context).submit(function(event){
		var $this =  $(this);
		var formid = $this.attr('id');
		var formOptions = Goingup.formOptions[formid]?Goingup.formOptions[formid]:{};
		var submit_block = jQuery('.submit_btn_room',$this);
		var submit_block_html = submit_block.html(); 
		var defaults = {
			show_inline_loader_for:submit_block,
			callBefore:function(ob){
				if (formOptions['callBefore'] instanceof Function){
					formOptions['callBefore']();
				}
				if ($this.attr('_loading')=='yes'){
					Goingup.Dialog.showLoadingBox('','200px');	
				}
			}
		}
		var options = defaults;
		if (Goingup.formOptions[formid]){
			if (Goingup.formOptions[formid] instanceof Object){
				for (k in Goingup.formOptions[formid]){
					options[k] = Goingup.formOptions[formid][k];
				}
			}
		}
		return Goingup.Form.Submit(this,null,options);	
	});
};

/**
 * simple copy of php http_build_query function
 */
Goingup.http_bild_query = function (obj,separator){
						var arg_separator = (typeof separator!= 'undefined')?separator:escape('&');
						var use_key, use_val;
						var tmp_arr = [];
						var i =0;
						for(key in obj){
							if (obj[key] instanceof Array){
								tmp_arr[i] = Goingup.http_bild_query_from_obj(key,obj[key]);
							}else if (obj[key]!=null){
						        use_key = encodeURIComponent(key);
						        use_val = encodeURIComponent((obj[key].toString()));
						        use_val = use_val.replace(/%20/g, '+');
						 
						        tmp_arr[i] = use_key + '=' + use_val;
						        
					        	
							}
							i++;
					    }
						var result = tmp_arr.join(arg_separator);
					    return result;
};
/**
 * helper for previous function
 */
Goingup.http_bild_query_from_obj = function (mainkey,obj){
						var arg_separator = escape('&');
						var use_key = mainkey;
						var use_val = '';
						var tmp_arr = [];
						var i=0;
						for(key in obj){
					        
					        use_val = encodeURIComponent((obj[key].toString()));
					        use_val = use_val.replace(/%20/g, '+');
					 
					        use_key = mainkey + '['+key+']';
							use_key = encodeURIComponent(use_key);
							
					        tmp_arr[i] = use_key + '=' + use_val;
					        i++;
					    }
		
					    return tmp_arr.join(arg_separator);
};
/**
 *  if there is form in dialog window than it will wraped to ajax layer, 
 *  but if form has '_no_ajax' class than wrapping to ajax layer will not be happened
 * 
 *	Goingup.Dialog.Show(options);
 *  options = {
 *  	msg_title:'title of box',
 *  	msg:'message will be showed in them box',
 *  	buttons:[
 *  			{value:'Text on button',class:'ok|ko',onclick:'any js code here'}
 *  			{value:'Text on button',class:'ok|ko',onclick:'any js code here'}
 *  			....
 *  			]
 *  } 
 */
Goingup.Dialog = function (){
	jQuery(window).keypress(function(e){
		switch (e.keyCode){
			case 27:
				Goingup.Dialog.Hide();
			break;
		}
		
	});
	
	return {
		template:'<div id="div_modal_window" class="modalwindow" style="display:none">\
					<div class="border_top"><div class="in-r"><div class="in-m"></div></div></div>\
				    <div class="content">\
						<div class="in-r">\
					    	<div class="head">\
					        	<h1></h1>\
					        </div>\
					        <div class="body">\
					        	\
					        </div>\
					        <div class="foot">\
								<div class="misc"></div>\
					        	<div class="btns">\
					            </div>\
					        </div>\
				    	</div>\
				    	<a class="btn_close" href="#modal-window-close" onclick="Goingup.Dialog.Hide();">Close [X]</a>\
					</div>\
				    <div class="border_bottom"><div class="in-r"><div class="in-m"></div></div></div>\
				</div>',
		onchangeAplied:false,
		timeOut:{},
		movingVars:{moving:false,topWidth:0, leftWidth:0},
		defaultWidth:null,
		showLoadingBox:function(title,width){
			
			var data = {
				msg_title:( typeof title != 'undefined' && title!='' ?title:'Please wait...'),
				html:'<div><div class="loading_box"></div></div>',
            	buttons:[]
			};
			if (typeof width !='undefined' && width!=''){
				data['width'] = width;
			}
			data['buttons'] = 'none';
			data['hide_close_button'] = true;
			this.Show(data);
		},
		Options:{
			dialogId:'div_modal_window',
			blockbgId:'div_backgroundblacklayer'
		},
		Selectors:{
			id:'#div_modal_window',
			title:'.head>h1',
			body:'.body',
			buttons:'.foot>.btns',
			misc:'.foot>.misc',
			footer:'.foot',
			moveHandler:'.head',
			blockbg:'#div_backgroundblacklayer',
			btnclose:'.btn_close'
		},
		Templates:{
			//btn:'<a href="javascript:;" class="[class]" onclick="[onclick]">[value]</a>'
			btn:'<a href="javascript:;" class="[class]" ><span class="r"><span class="m">[value]</span></span></a>'
		},
		getButtonHtml:function(value,cls){
			
			var value = typeof value !='undefined'?value:'OK';
			var cls = typeof cls != 'undefined'?cls:'button';
			
			var tpl = this.Templates.btn;
			
			tpl = tpl.replace(/\[class\]/g,cls).replace(/\[value\]/g,value);
			
			return tpl;
		},
		getButton:function(value,onclick,cls){
			var value = typeof value !='undefined'?value:'OK';
			var cls = typeof cls != 'undefined'?cls:'button';
			var onclick = typeof onclick != 'undefined'?onclick:'cancel';
			
			var onclick_action = null;
			var btn = jQuery(this.getButtonHtml(value,cls));
			var $this = this; 
			switch (onclick){
				case 'ok':
					btn[0].onclick = function(){ $this.OK(); };
					break;
				case 'cancel':
					btn[0].onclick = function(){ $this.Hide(); };
					break;
				default:
					btn[0].onclick = function(){ if (onclick!='') { eval(onclick); } };
					break;
			}
			
			return btn;
		},
		OK:function(){
			this.Submit();
		},
		blockUI:function(){
			var ob = this;
			
			if (jQuery(ob.Selectors.blockbg).length==0){
				var div = jQuery('<div id="'+ob.Options.blockbgId+'"></div>');
				jQuery('body').append(div);
			}else{
				var div = jQuery(ob.Selectors.blockbg);
			}
			var pageSize = Goingup.getPageSize();
		
			div.height(pageSize[1]);
			div.width(pageSize[0]);
			//div.width('100%');
			if (!div.is(':visible')){
				div.fadeIn(300);
			}
		},
		redrawUI:function(){
			var ob = this;
			
			if (jQuery(ob.Selectors.blockbg).length==0){
				var div = jQuery('<div id="'+ob.Options.blockbgId+'"></div>');
				jQuery('body').append(div);
			}else{
				var div = jQuery(ob.Selectors.blockbg);
			}
			
			this.moveCenter();
		},
		startMoving:function(e){
			var ob = this;
			ob.movingVars.moving = true;
			
			var oPopup = jQuery(this.Selectors.id);
			
			var offset = oPopup.offset();
			
			var mouseX = ob.mouseX(e);
			var mouseY = ob.mouseY(e)
			
			ob.movingVars.topWidth = mouseY - offset.top;
			ob.movingVars.leftWidth = mouseX - offset.left;
		},
		endMoving:function(e){
			var ob = this;
			ob.movingVars.moving = false;
		},
		moveCenter:function(){
			var ob = this;
			clearTimeout(ob.timeOut['moveCenter']);
			
			ob.timeOut['moveCenter'] = setTimeout(function(){
				var div = jQuery(ob.Selectors.blockbg);
				if (div.is(':visible')){
					var pageSize = Goingup.getPageSize();
					div.height(pageSize[1]);
					div.width(pageSize[0]);
					jQuery(ob.Selectors.id).ScrollCenter();
				}
			},100);
			
			
		},
		mouseX: function mouseX(evt) {
					if (evt.pageX) return evt.pageX;
					else if (evt.clientX)
					   return evt.clientX + (document.documentElement.scrollLeft ?
					   document.documentElement.scrollLeft :
					   document.body.scrollLeft);
					else return null;
		},
		mouseY:function (evt) {
					if (evt.pageY) return evt.pageY;
					else if (evt.clientY)
					   return evt.clientY + (document.documentElement.scrollTop ?
					   document.documentElement.scrollTop :
					   document.body.scrollTop);
					else return null;
		},
		Submit:function(){
			jQuery(this.Selectors.id).find('form').submit();
		},
		/**
		 * data = {
		 * 		msg_title:'box title',
		 * 		html:'<div> this is html content</div>'
		 * }
		 */
		Show:function(data,mode){
			var ob = this;
			var html = data.msg?data.msg:'';
			var misc = typeof data.misc != 'undefined'?data.misc:'';
			if (typeof data.html == 'string'){
				html = html+' '+data.html; 
			}
			
			// if mode provided, 
			// in auto mode we should not close previous popup window
			// just stop here and quit.
			// otherwise previous popup will be closed
			if (typeof mode != 'undefined' && mode=='auto'){
				if (!html){
					return true;
				}
			}
			
			
			if (html != '' && html!=null){
				var popup = jQuery(ob.Selectors.id); 
				if (popup.length == 0){
					popup = jQuery(this.template);
					jQuery('body').append(popup);
				}
				
				if (data.msg_title){
					popup.find(ob.Selectors.title).html(data.msg_title);
				}else if(data.title){ 
					popup.find(ob.Selectors.title).html(data.title);
				}else{
					popup.find(ob.Selectors.title).html('Message');
				}	
				if (data.hide_close_button){
					popup.find(ob.Selectors.btnclose).hide();
				}
				if (data.width){
					var w = popup.width();
					if (parseInt(data.width) != parseInt(w)){
						
						ob.defaultWidth = popup.css('width');
						// fix for opera
						if (ob.defaultWidth == '0px'){
							ob.defaultWidth = 'auto';
						}
						popup.css('width',data.width);
					}
				}else if (ob.defaultWidth!=null){
					popup.css('width',ob.defaultWidth);
				}
				popup.find(ob.Selectors.misc).html(misc);
				popup.find(ob.Selectors.body).html(html);
				popup.find(ob.Selectors.buttons).empty().html('<div style="clear: both;"></div>');
				
				
				if (typeof data.buttons != 'undefined' && data.buttons!=null && data.buttons.length>0 && data.buttons!='none'){
					var buttons = data.buttons;
					for (var i=0; i<buttons.length; i++){
						var buttonclass = buttons[i]['class']?buttons[i]['class']:'button';	
						var button = ob.getButton(buttons[i].value,buttons[i].onclick,buttonclass);
						popup.find(ob.Selectors.buttons).prepend(button);
					}
					
					popup.find(ob.Selectors.footer).show();
				}else if (typeof data.buttons == 'undefined'){
					
					var button = ob.getButton();
					
					popup.find(ob.Selectors.buttons).prepend(button);
					popup.find(ob.Selectors.footer).show();
				}else{
					//jQuery(ob.Selectors.footer,ob.Selectors.id).hide();
					popup.find(ob.Selectors.footer).css('min-height','20px');
				}
				
				ob._show(data);
			}else{
				ob.Hide();
			}
		},
		Hide:function(data){
			var ob = this;
			ob._hide();
			jQuery(ob.Selectors.id).css('width',ob.defaultWidth);
		},
		_show:function(data){
			
			var ob = this;
			
			ob.blockUI();
			
			var oPopup = jQuery(ob.Selectors.id);
			if (ob.onchangeAplied == false){
				ob.onchangeAplied = true;
				jQuery(window).resize(function(){
					if (ob.movingVars.moving==false){
						ob.redrawUI();
					}
				});
				jQuery(window).scroll(function(){
					if (ob.movingVars.moving==false){
						ob.redrawUI();
					}
				});
				
				jQuery('body').mousemove(function(e){
					if (ob.movingVars.moving==true){
						
						var left = ob.mouseX(e)-ob.movingVars.leftWidth;
						var top = ob.mouseY(e)-ob.movingVars.topWidth;
						oPopup.css({'left':left,'top':top});
					}
					return false;
				});
				
				jQuery(ob.Selectors.moveHandler,ob.Selectors.id).mousedown(function(e){
					
					ob.startMoving(e);
					return false;
				});
				jQuery(ob.Selectors.moveHandler,ob.Selectors.id).mouseup(function(e){
					ob.endMoving(e);
					return false;
				});
			}
			
			jQuery(ob.Selectors.id).ScrollCenter().fadeIn(200);
			
			if (jQuery(ob.Selectors.id).find('form').find("input[type='file']").length==0){
			jQuery(ob.Selectors.id).find('form').unbind().submit(function(){
					if (jQuery(this).hasClass('_no_ajax')){
						return true;
					}
					var fmId = this.id;
					var options = {
									loader_class:data['loader_class']!=null?data['loader_class']:'inline_loader',
									show_inline_loader_for:'.foot>.btns'
								  }
					/**
					 * process predefined options
					 */
					if (fmId!=null && Goingup.formOptions[fmId]!=null){
						for (var k in Goingup.formOptions[fmId]){
							options[k]=Goingup.formOptions[fmId][k];
						}
					}
					return Goingup.Form.Submit(this,null,options);
				});
			}
			//jQuery(ob.Selectors.id).ScrollCenter();
		},
		_hide:function(){
			var ob = this;
			jQuery(ob.Selectors.blockbg).fadeOut(200);
			jQuery(ob.Selectors.id).fadeOut(200);
		}
	} 
}();
Goingup.RequestHandler = function(){
	return {
		processHtmlBlocks : function(blocks){
			// fill provided html blocks
			/**
			 * example:
			 * 	data.blocks = [
			 * 		{'selector':'#id>div>div','html'=>'any html content here'},
			 * 		{'selector':'#id>div>div','html'=>'any html content here'},
			 * 		..................
			 * ]
			 */
			if (typeof(blocks)!='undefined' && blocks.length>0){
				for (var _i=0; _i<blocks.length; _i++){
					if (typeof blocks[_i] != 'undefined' && blocks[_i].selector && blocks[_i].html){
						jQuery(blocks[_i].selector).html(blocks[_i].html);
					}
				}
				return true;
			}else{
				return false;
			}
		},
		
		processVisualizer:function(data,op){
			var defaults = {
				'resultHandler':'inline', // popup, inline, marker, popup&marker, inline&marker
				'inlineBlockId':'__ajax__response__',
				'formInstance':null
			};
			
			var options = jQuery.extend(defaults,op);
			
			switch (options.resultHandler){
				case 'popup':
					if (typeof data.popup != 'undefined'){
						Goingup.Dialog.Show(data.popup);
					}else{
						Goingup.Dialog.Show(data);
					}
				break;
				case 'inline':
					var html = data.msg?data.msg:'';
			
					if (typeof data.html == 'string'){
						html = html+' '+data.html; 
					}
				
					if (html){
						jQuery('#'+options.inlineBlockId).empty().html(html);
					}
					if (typeof data.popup != 'undefined'){
						Goingup.Dialog.Show(data.popup);
					}
				break;
				case 'marker':
					// mark all error fields in form
					if (options.formInstance){
						Goingup.MarkErrorFields(options.formInstance,data.idents,data.msgs);
					}
					if (typeof data.popup != 'undefined'){
						Goingup.Dialog.Show(data.popup);
					}
				break;
				case 'popup&marker':
					if (typeof data.popup != 'undefined'){
						Goingup.Dialog.Show(data.popup);
					}else{
						Goingup.Dialog.Show(data);
					}
					if (options.formInstance){
						Goingup.MarkErrorFields(options.formInstance,data.idents,data.msgs);
					}
					
				break;
				case 'inline&marker':
					var html = data.msg?data.msg:'';
			
					if (typeof data.html == 'string'){
						html = html+' '+data.html; 
					}
				
					if (html){
						jQuery('#'+options.inlineBlockId).empty().html(html);
					}
					if (typeof data.popup != 'undefined'){
						Goingup.Dialog.Show(data.popup);
					}
					if (options.formInstance){
						Goingup.MarkErrorFields(options.formInstance,data.idents,data.msgs);
					}
					if (typeof data.popup != 'undefined'){
						Goingup.Dialog.Show(data.popup);
					}
				break;
				default:
					Goingup.Dialog.Show(data);
				break;
			}
		},
		
		process:function(data,op){
			
			var defaults = {
					  			"resultHandler"		:"inline", // popup, inline, marker, popup&marker, inline&marker
								"inlineBlockId"		:"__ajax__response__",
								"formInstance"		:null,
					  			"callAfterFailed"	:function(data){},
					  			"callAfterSuccess"	:function(data){},
					  			"callAfter"			:function(){}
					  		}
			var options = jQuery.extend(defaults,op);
			
			if (typeof data == 'undefined' || !data) return false;
			
			
			
			if (typeof data.ok != 'undefined' && data.ok){
				
				// if script returned  "true" than we need submit form directly without ajax
				if (typeof data['return'] != 'undefined' && data['return']!=null && data['return']!=false){
					options.formInstance.attr('submitDirectly',true); 
					return jQuery(options.formInstance).submit();
				}
				
				// process html blocks send from server
				this.processHtmlBlocks(data.blocks);
				// result visualizer
				this.processVisualizer(data,options);
				
				// run javascript provided from server
				if (typeof data.js != 'undefined' && data.js!=null && data.js!='' ){
					eval(data.js);
				}
				
				// run user provided success handler
				if (options.callAfterSuccess instanceof Function){
					options.callAfterSuccess(data,options.formInstance);
				}
			}else{
				// process html blocks send from server
				this.processHtmlBlocks(data.blocks);
				
				// result visualizer
				this.processVisualizer(data,options);
				
				if (options.callAfterFailed instanceof Function){
					options.callAfterFailed(data,options.formInstance);
				}
			}
			
			if (options.callAfter instanceof Function){
				options.callAfter(data,options.formInstance);
			}
		}
	}
}();



/**
 * options - setings:
 * 		{
 * 			url							:request url
 * 			params						:http get params
 * 			callBefore					:function(data){},
 * 			show_inline_loader_for		:selector, - if not null than will be placed into it loader block
 * 			loading						:boolean, - if false than "Loading..." text will not be showed
 * 			callAfterFailed				:function(data){},
 * 			callAfterSuccess			:function(data){},
 * 			callAfter					:function(){},
 * 		}
 */
Goingup.Request = function(op){
					var defaults = {
						"params":{},
						"show_inline_loader_for":null,
						"inline_loader_no_message":false,
						"loader_class":"inline_loader",
						"loading":true,
						"mode":"standard",
						"resultHandler":"popup",
						"inlineBlockId":"__ajax__response__",
						"overrideFunction":null,
						"callBefore":null,
						"callAfterFailed":null,
						"callAfterSuccess":null,
						"callAfter":null,
						"formInstance":null
					};
					
					var options = jQuery.extend(defaults,op);
	
					if (options.callBefore instanceof Function){
						options.callBefore();
					}
					
					if (options.show_inline_loader_for!=null){
						if (options.inline_loader_no_message){
							jQuery(options.show_inline_loader_for).html(jQuery('<div></div>').attr('class',options.loader_class));
						}else{
							jQuery(options.show_inline_loader_for).html(jQuery('<div></div>').attr('class',options.loader_class).html('Please wait...'));	
						}
					}
					
					jQuery.ajax({
						type:options.method?options.method:'get',
						url:options.url?options.url:window.location.href.replace(/\?.*|#.*/,''),
						data:Goingup.Form.applyHiddenParams(options.params),
						dataType: 'json',
						success: function(data){
							Goingup.RequestHandler.process(data,options);
					   	},
					   	error:function(){
					   		var data = {ok:false,msg:'Request failed, check your connection!','msg_title':'Internal error'}
							Goingup.RequestHandler.process(data,options);
					   	}
					});
					return false;
};
Goingup.MarkErrorFields = function(objForm,fields,msgs){
	objForm.find('input,select,textarea,button,image').removeClass('x-error');
	if (typeof fields == 'undefined'){
		return false;
	}
	var showMarkerMessages = false;
	if (typeof msgs != undefined && msgs.length>0){
		showMarkerMessages = true;	
	}
	
	for (var i=0; i<fields.length; i++){
		var field = objForm.find("[name^='"+fields[i]+"']");
		if (field.length>0){
			field.addClass('x-error').after(jQuery('<div class="errormarker">*'+msgs[fields[i]]+'</div>'));
		}
	}
	
	
	
};
/**
 * objForm - form object
 * params - additional params for request
 * options - setings:
 * 		{
 * 			
 * 			show_inline_loader_for		:selector, - if not null than will be placed into it loader block
 * 			loading						:boolean, - if false than "Loading..." text will not be showed
 * 			mode						:auto|null
 * 			resulthandler				:"popup", // popup, inline, marker, popup&marker, inline&marker
 * 			inlineBlockId				:"",
 * 			overrideFunction			:fucntion(){},
 * 			callBefore					:function(data){},
 * 			callAfterFailed				:function(data){},
 * 			callAfterSuccess			:function(data){},
 * 			callAfter					:function(){}
 * 			
 * 		}
 */
Goingup.Form = function(){
	return {
		result:false,
		hiddenParams:{'__request_type__':'ajax'},
		applyHiddenParams:function(params){
			for (var i in Goingup.Form.hiddenParams){
				if (params instanceof Array){
					var obj = {'name':i,'value':Goingup.Form.hiddenParams[i]};
					params[params.length] = obj;
				}else if(params instanceof Object){
					params[i] = Goingup.Form.hiddenParams[i];	
				}else if(params.constructor = String){
					params += '&'+i+'='+Goingup.Form.hiddenParams[i];	
				}
			}
			return params;
		},
		Submit:function(objFm,params,op){
					var defaults = {
						"show_inline_loader_for":null,
						"inline_loader_no_message":false,
						"loader_class":"inline_loader",
						"loading":true,
						"mode":"standard",
						"resultHandler":"popup",
						"inlineBlockId":"__ajax__response__",
						"overrideFunction":null,
						"callBefore":null,
						"callAfterFailed":null,
						"callAfterSuccess":null,
						"callAfter":null,
						"formInstance":null,
						"autostate":true
					};
					
					var options = jQuery.extend(defaults,op);
			
					options.formInstance = jQuery(objFm);
			
					if (options.overrideFunction instanceof Function){
						var p = options.formInstance.serializeArray();
						var data = {};
						for (var i=0; i<p.length; i++){
							data[p[i]['name']] = p[i]['value'];
						}
						return options.overrideFunction(data);
					}
					
					if (options.formInstance.attr('submitDirectly') == true){
						return true;
					}
					if (options.callBefore instanceof Function){
						options.callBefore(objFm);
					}
					
					var current = options.formInstance;
					var current_data = Goingup.Form.applyHiddenParams((params!=null)?params:current.serializeArray());
					if (options.autostate){
						var buffer = jQuery(options.show_inline_loader_for).children();
					}
					if (options.show_inline_loader_for!=null){
						if (options.inline_loader_no_message){
							jQuery(options.show_inline_loader_for).html(jQuery('<div></div>').attr('class',options.loader_class));
						}else{
							jQuery(options.show_inline_loader_for).html(jQuery('<div></div>').attr('class',options.loader_class).html('Please wait...'));	
						}
					}
					
					if (options.loading==true){
						jQuery.each(current.find(":input[type='submit']"),function(){
							jQuery(this).attr('name',jQuery(this).val());
							jQuery(this).val('Loading...');
						});
					}
					options.formInstance.find('input,select,textarea,button,image').removeClass('x-error');
					options.formInstance.find('.errormarker').remove();
					jQuery('#'+options.inlineBlockId).empty();
					jQuery.ajax({
						type:current.attr('method'),
						url:current.attr('action'),
						data:current_data,
						dataType: 'json',
						success: function(data){
							
							if (options.loading==true){
								jQuery.each(current.find(":input[type='submit']"),function(){
									jQuery(this).val(jQuery(this).attr('name'));
									jQuery(this).blur();
								});
							}
							
							if (options.autostate && !data.ok){
								jQuery(options.show_inline_loader_for).empty().append(buffer);
							}else{
								//jQuery(options.show_inline_loader_for).empty().append('Done!');
							}
							
							/* request handling */
					   		Goingup.RequestHandler.process(data,options);
					   	},
					   	error:function(data){
							if (options.callAfterFailed instanceof Function){
								var data = {ok:false,msg:'Request failed, check your connection!','msg_title':'Internal Error!'};
								Goingup.RequestHandler.process(data,options);
							}
					   	}
					});
					return Goingup.Form.result;
				}
	}
}();
Goingup.getPageSize = function(){
	//
	// getPageSize()
	// Returns array with page width, height and window width, height
	// Core code from - quirksmode.com
	// Edit for Firefox by pHaez
	//
	var xScroll, yScroll;
	
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = window.innerWidth + window.scrollMaxX;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	
	var windowWidth, windowHeight;
	
	if (self.innerHeight) {	// all except Explorer
		if(document.documentElement.clientWidth){
			windowWidth = document.documentElement.clientWidth; 
		} else {
			windowWidth = self.innerWidth;
		}
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}	
	
	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}

	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){	
		pageWidth = xScroll;		
	} else {
		pageWidth = windowWidth;
	}
	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
	return arrayPageSize;
};

Goingup.number_format = function( number, decimals, dec_point, thousands_sep ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://getsprink.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +     bugfix by: Howard Yeend
    // +    revised by: Luke Smith (http://lucassmith.name)
    // +     bugfix by: Diogo Resende
    // +     bugfix by: Rival
    // +     input by: Kheang Hok Chin (http://www.distantia.ca/)
    // +     improved by: davook
    // +     improved by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: number_format(1234.56);
    // *     returns 1: '1,235'
    // *     example 2: number_format(1234.56, 2, ',', ' ');
    // *     returns 2: '1 234,56'
    // *     example 3: number_format(1234.5678, 2, '.', '');
    // *     returns 3: '1234.57'
    // *     example 4: number_format(67, 2, ',', '.');
    // *     returns 4: '67,00'
    // *     example 5: number_format(1000);
    // *     returns 5: '1,000'
    // *     example 6: number_format(67.311, 2);
    // *     returns 6: '67.31'
    // *     example 7: number_format(1000.55, 1);
    // *     returns 7: '1,000.6'
    // *     example 8: number_format(67000, 5, ',', '.');
    // *     returns 8: '67.000,00000'
    // *     example 9: number_format(0.9, 0);
    // *     returns 9: '1'
    var n = number, prec = decimals;
    var toFixedFix = function (n,prec) {
        var k = Math.pow(10,prec);
        return (Math.round(n*k)/k).toString();
    };
 
    n = !isFinite(+n) ? 0 : +n;
    prec = !isFinite(+prec) ? 0 : Math.abs(prec);
    var sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep;
    var dec = (typeof dec_point === 'undefined') ? '.' : dec_point;
 
    var s = (prec > 0) ? toFixedFix(n, prec) : toFixedFix(Math.round(n), prec); //fix for IE parseFloat(0.55).toFixed(0) = 0;
 
    var abs = toFixedFix(Math.abs(n), prec);
    var _, i;
 
    if (abs >= 1000) {
        _ = abs.split(/\D/);
        i = _[0].length % 3 || 3;
 
        _[0] = s.slice(0,i + (n < 0)) +
              _[0].slice(i).replace(/(\d{3})/g, sep+'$1');
        s = _.join(dec);
    } else {
        s = s.replace('.', dec);
    }
    if (s.indexOf(dec) === -1 && prec > 1) {
        s += dec+new Array(prec).join(0)+'0';
    }
    return s;
};
Goingup.doTooltipsTimeOut = null;
Goingup.doTooltips 	= function(html_block_selector,offsettop,offsetleft){
	if (html_block_selector==null) html_block_selector = 'body';
	
	var offsettop = typeof offsettop !='undefined'?offsettop:25;
	var offsetleft = typeof offsetleft !='undefined'?offsetleft:0;
	
	jQuery('._tooltip',html_block_selector).unbind();
	jQuery('._tooltip',html_block_selector).mouseover(function (){
		clearTimeout(Goingup.doTooltipsTimeOut);
		var jThis = jQuery(this);
		var divTooltip = jQuery('#_tooltip');
		if (divTooltip.length==0){
			//create tooltip div
			var htmlTooltip = "<div id=\"_tooltip\" style=\"display:none; position:absolute\"></div>";
			jQuery('body').append(htmlTooltip);
			divTooltip = jQuery('#_tooltip');
			
			divTooltip.mouseover(function(){
				clearTimeout(Goingup.doTooltipsTimeOut);
			});
			divTooltip.mouseout(function(){
				clearTimeout(Goingup.doTooltipsTimeOut);
				Goingup.doTooltipsTimeOut = setTimeout(function(){
					jQuery('#_tooltip').hide();
				},100);
			});
			
		}else{
			//use existing toolyip div
			divTooltip = jQuery('#_tooltip');
			
		}
		
		divTooltip.html(jThis.attr('rel'));
		//this.title = '';
		var this_offset = jThis.offset();
		var left = parseInt(this_offset.left) + parseInt(offsetleft);
		var top = parseInt(this_offset.top) + parseInt(offsettop);
		
		divTooltip.css({'left':left+'px','top':top+'px'}).show();
		
		jQuery('#_tooltip').show();
	});
	jQuery('._tooltip',html_block_selector).mouseout(function (){
		clearTimeout(Goingup.doTooltipsTimeOut);
		Goingup.doTooltipsTimeOut = setTimeout(function(){
			jQuery('#_tooltip').hide();
		},100);
		
		
	});
};
Goingup.IsNumeric = function(sText){
   if (sText=='') return false;
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;

   for (i = 0; i < sText.length && IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;
};
Goingup.truncate = function(text,chars,dots){
			var chars 	= typeof chars != 'undefined'?chars:80;
			var dots 	= typeof dots != 'undefined'?dots:'...';
			if (text.length>chars){
				text = text.substring(0,chars)+dots;
			}
			
			return text;
};
