/*
*	Textor class - any Textor specific, reusable functionalitie should be implemented here
*/
function Textor(params){
	if(params.popUp){this.popUp=new popUp();}
	this.pageEdit={
		'pageLinked' : false
	};
	return this;
}

/*
*	Textor popUp class
*/
function popUp(){
	this.popUpHTMLAdded = false;

	/*
	*	main pop-up call function
	*/
	function popUpMsg(parms){
		// Load default parameters		
		parmsDef={
			preMessage : '<p>Please wait! Loading in progress...<\/p>',
			errorMessagePrefix : 'Sorry but there was an error: ',
			close : 'button',
			popUpId1 : 'pp_msg_body',
			popUpId2 : 'pp_msg_cnt',
			buttons : {
					close : {
						'switch' : 'on',
						name : 'textor_popup_close_btn',
						html : '<span class="textor-popup-btn">Close</span>',
						action : popUpClose
					},
					save : {
						'switch' : 'on',
						name : 'textor_popup_save_btn',
						html : '<span class="textor-popup-btn">Save</span>',
						action : popUpReload
					}
			},
			timeout : 1500
		};

		// Override default parameters with ones passed to the function
		parms=syncroniseParameters(parmsDef,parms);

		if(!this.popUpHTMLAdded){
			if($('#'+parms.popUpId1).length==0){
				$('<div id="'+parms.popUpId1+'"></div>').insertAfter('.body');
			}
			if($('#'+parms.popUpId2).length==0){
				$('<div id="'+parms.popUpId2+'"></div>').insertAfter('.body');
			}
			$('#'+parms.popUpId2).html(parms.preMessage);
			$('#'+parms.popUpId1).css({
				'top' : '0px',
				'left' : '0px',
				'z-index' : '999',
				'background-image' : 'url(/images/popup_bckg.png)',
				'background-color' : '#fff',
				'opacity' : '0.7',
				'_filter' : 'alpha(opacity=70)',
				'position' : 'absolute',
				'width' : '100%',
				'height' : ($('body').height() > $(window).height() ? $('body').height() : $(window).height()),
				'display' : 'none',
				'text-align':'left'
			});
			$('#'+parms.popUpId2).css({
				'position' : 'absolute',
				'left' : (($('body').width()-($('body').width()*0.7))/2)+'px',
				'border' : '0px solid gray',
				'width' : '70%',
				'height' : 'auto',
				'max-height' : '90%',
				'padding' : '20px',
				'overflow' : 'auto',
				'background-color' : '#fff',
				'z-index' : '9999',
				'display' : 'none',
				'text-align' : 'center',
				'border' : '1px solid gray',
				'text-align':'left'
			});
			this.popUpHTMLAdded=true;
		}
		else{
			$('#'+parms.popUpId2).html(parmsDef.preMessage);
		}


		$('#'+parms.popUpId1).css({'display':'inline-block'});
		$('#'+parms.popUpId2).html(parms.preMessage);
		$('#'+parms.popUpId2).css({'display':'inline-block'});
		
		if(parms.url && parms.url!='#' && parms.url!=''){
			getData(parms,'');
		}
		else if(parms.data){
			popUpLoadData(parms.data,parms);
		}
		else if(parms.container){
			popUpLoadData($(parms.container).html(),parms);
		}
	};

	/*
	*	request the data and load it in the popup
	*/
	function getData(parms,url,button){
		if(!url || url==''){url=parms.url;}
		var parsedURL=parseURL(url);
		$('#'+parms.popUpId2).html(parms.preMessage);
		$.ajax({
			'url' : parsedURL.url,
			'data' : (parsedURL.params),
			'cache' : false,
			'success' : function(data){
				/*
				*	Evaluate results
				*/
				if(button && parms.buttons[button]['eval']){
					eval(data);
				}
				/*
				*	Load data in the popUp
				*/
				else{
					popUpLoadData(data,parms);
				}
				/*
				* Run callback after successful popUp
				*/
				if(parms.callback){
					parms.callback();
				}
			}
		});
	}

	/*
	* Load the data into the pop-up box
	*/
	function popUpLoadData(data,parms){

		if(parms.close=='auto'){
			$('#'+parms.popUpId2).html(data);
			setTimeout(function(){
				popUpClose('',parms);
			},parms.timeOut);
		}
		else{
			//
			//	draw buttons
			//
			var buttons='';
			for(var button in parms.buttons){
				if(parms.buttons[button]['switch']=='off'){continue;}
				var tmpbtn=$(parms.buttons[button].html);
				tmpbtn.addClass(parms.buttons[button].name);
				tmpbtn.attr('id','textor_popup_btn_'+button);
				buttons += tmpbtn.clone().wrapAll("<div/>").parent().html();
			}
			buttons = $('<div class="textor-popup-panel"></div>').html(buttons).clone().wrapAll("<div/>").parent().html();
			$('#'+parms.popUpId2).html(buttons+data);

			$('.textor-popup-panel').css({
				'float' : 'right',
				'width' : '100%',
				'margin-bottom' : '20px'
			});
			$('.textor-popup-btn').css({
				'float' : 'right',
				'width' : 'auto',
				'padding' : '5px',
				'border' : '1px solid gray',
				'cursor' : 'pointer',
				'margin-left' : '5px'
			}).hover(
				function(){$(this).css({'background-color':'#E79A36','color':'#fff'})},
				function(){$(this).css({'background-color':'transparent','color':'gray'})}
			);

			//
			//	assign actions to buttons
			//
			for(var button in parms.buttons){
				if(parms.buttons[button].action){
					$('#textor_popup_btn_'+button).bind('click',function(){
						var temp=$(this).attr('id');
						temp=temp.replace(/textor_popup_btn_/,'');
						parms.buttons[temp].action(temp,parms);

						// run callback if set
						if(parms.buttons[temp].callback){
							parms.buttons[temp].callback();
						}

						// close popUp on successful action
						if(parms.buttons[temp].close){
							popUpClose('',parms);
						}
					});
				}
			}
		}
		var tempMargin = Math.round((($(window).height() - $('#'+parms.popUpId2).height())/2) + $(document).scrollTop())+'px';
		$('#'+parms.popUpId2).css({
			'top': tempMargin
		});

	};

	/*
	*
	*	Close the pop-up box
	*
	*/
	function popUpClose(button,parms){
		$('#'+parms.popUpId2).slideToggle(500,function(){
				$('#'+parms.popUpId1).css({'display':'none'});
			}
		).css({'display':'none'});
	};
	
	/*
	*	Reload the pop-up content
	*/
	function popUpReload(button,parms){
		var url='';
		if(typeof(parms.buttons[button].url) == 'function'){
			url = parms.buttons[button].url();
		}
		else{
			url = parms.buttons[button].url;
		}
		getData(parms,url,button);
	}


	/*
	*
	*	
	*
	*/
	this.popUpMsg=popUpMsg;
	this.popUpLoadData=popUpLoadData;
	this.popUpClose=popUpClose;
	return this;
}

/***********
*
*		General prupose functions
*
************/

/*
* parses URL provided as parameter and return object of strings
* example:
*	input -
		url: http://botest.dev.textor.com:8080/cgi-bin/pp/regen.pl?Pages=1&ID=botest&SubSite=en&ajax=Y&choice=1&choice=2#home
*	output -
		source: http://botest.dev.textor.com:8080/cgi-bin/pp/regen.pl?Pages=1&ID=botest&SubSite=en&ajax=Y&choice=1&choice=2#home,
		protocol: http,
		host: botest.dev.textor.com,
		port: 8080,
		query: ?Pages=1&ID=botest&SubSite=en&ajax=Y&choice=1&choice=2,
		params: {
			'Pages' : '1',
			'ID' : 'botest',
			'SubSite' : 'en',
			'ajax' : 'Y',
			'choice' : [1,2]
		},
		file: regen.pl,
		hash: home,
		path: /cgi-bin/pp/regen.pl,
		relative: /cgi-bin/pp/regen.pl?Pages=1&ID=botest&SubSite=en&ajax=Y#home,
		segments: cgi-bin,pp,regen.pl
*/
function parseURL(url){
	var a =  document.createElement('a');
	url=url.replace(/\&amp\;/g,'&');
	a.href = url;
	var result = {
		source: url,
		protocol: a.protocol.replace(':',''),
		host: a.hostname,
		port: a.port,
		query: a.search,
		params: (	function(){
								var ret = {},
								seg = a.search.replace(/^\?/,'').split('&'),
								len = seg.length, i = 0, s;
								for (;i<len;i++){
									if (!seg[i]){ continue;}
									s = seg[i].split('=');
									if(typeof(ret[s[0]]) == 'object' || typeof(ret[s[0]]) == 'array'){
										ret[s[0]][ret[s[0]].length]=s[1];
									}
									else if(ret[s[0]]){
										var temp=ret[s[0]];
										ret[s[0]] = new Array();
										ret[s[0]][0]=temp;
										ret[s[0]][1]=s[1];
									}
									else{
										ret[s[0]]=s[1];
									}
								}
								return ret;
						})(),
		file: (a.pathname.match(/\/([^\/?#]+)$/i) || [,''])[1],
		hash: a.hash.replace('#',''),
		path: a.pathname.replace(/^([^\/])/,'/$1'),
		relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [,''])[1],
		segments: a.pathname.replace(/^\//,'').split('/')
	};

	result.url=((a.protocol && a.protocol !='' && a.protocol !=':') ? a.protocol+'//' : '')+a.hostname+((a.port!=0) ? ':'+a.port : '')+a.pathname.replace(/^([^\/])/,'/$1');
	return result;
};


/*
*		serializes an html list into URL form
*/
function serializeList(selector){
	//
	//	as the ui's serilize was misbehaving 
	//
	var url='';
	var order=1;
	$(selector+' li').each(
		function(index){
			var str=$(this).attr('id').split('_');
			var key=str[(str.length-1)];
			var pattern='_'+key;
			var name=$(this).attr('id').replace(pattern,'');
			url+=name+"="+key+"&";
			url+=key+"_ord="+(order*10)+"&";
			order++;
		}
	);
	
	if(url!=''){
		url=url.replace(/\&amp\;/g,'');
		url=url.replace(/\[\]\=/g,'=');
		return url;
	}
	return ('');
}

/*
*		generates URL string
*			url: begening of the url
*			lists: an array of strings which are jquery selectors to be used 
*			for finding lists which are to be serialized into the URL
*/
function urlFromList(url,lists){
	var epageURL = '';
	for(var i=0;i<lists.length;i++){
		var temp=serializeList(lists[i]);
		if(temp){epageURL+=temp;}
	}
	return url+epageURL;
}

/*
*		Override values in obj1 with those provided in obj2
*/
function syncroniseParameters(obj1,obj2){
	for(var param in obj2){
		if(obj2[param]){
			if(typeof(obj1[param])=='object'){
				obj1[param]=syncroniseParameters(obj1[param],obj2[param]);
			}
			else{
				obj1[param]=obj2[param];
			}
		}
	}
	return obj1;
}

