ourHM = new HistoryManager();

Request.LBP = new Class({
	Extends: Request,
	options: {
        async: false,
		autoCancel: true,
        onRequest: function(){
            LBP.toggleLoading(true, this);
            if (this.options.caller){
            	//ourHM.setValue('url', 0, this.options.url);
		        //ourHM.setValue('url', 1, this.options.caller);
				ourHM.setValues('url', [this.options.url, this.options.caller]);
			}
		},
        onSuccess: function(responseString){
        	if (typeof pageTracker != 'undefined'){
        		pageTracker._trackPageview(this.options.url);
			}
            LBP.distributeHTML(responseString);
            LBP.runProcesses();
			LBP.runProcesses('after');
            LBP.toggleLoading.delay(100,false);
		},
		onFailure: function(){
            var accLeftBox = window.retrieve('accLeftBox');
			accLeftBox.generateAlert('Có lỗi trong quá trình truy cập. Xin xem lại đường truyền');
            LBP.toggleLoading.delay(100,false);
		}
	}
});

var LBP = new Hash({
    toggleLoading: function(state, currRequest) {
        if(!this.loadOverlay) {
            if(!$('lbp-loading-overlay')) {
                this.loadOverlay = new Element("div", { id: 'lbp-loading-overlay'});
                this.loadOverlay.set('styles', { position: 'absolute', display: 'none', opacity: 1, zIndex: 1200 });
                $(document.body).adopt(this.loadOverlay);
            } else {
                this.loadOverlay = $('lbp-loading-overlay');
            }
        }

        if(!this.loadOverlay.retrieve('hasRequestLoading')) {
			this.loadOverlay.addEvent('click', function(event){
                event.stopPropagation();
                //if(confirm('Bạn có chắc muốn cancel request?')) {
                    currRequest.cancel();
                    this.loadOverlay.set('styles', { display: 'none'});
                //}
            }.bind(this));
            this.loadOverlay.store('hasRequestLoading', true);
        }
        if(state) {
            var size = document.getSize();
            var scroll = document.getScroll();
            this.loadOverlay.set('styles',{ display: '', width: size.x+'px', height: size.y+'px', top: scroll.y+'px', left: scroll.x+'px' });
			document.body.style.cursor = "progress";
        } else {
            this.loadOverlay.set('styles',{display: 'none'});
			document.body.style.cursor = "default";
        }
    },

    displayPageJumpBox: function(baseUrl, queryString, perPage, lastPage, caller){
    	var pageNumber = prompt('Xin nhập vào số trang nhỏ hơn hoặc bằng ' + lastPage, '2');
		if (pageNumber > 0 && pageNumber < (lastPage+1)) {
			if (caller == 'browser'){
				window.location.href = baseUrl + '?offset=' + (pageNumber-1)*perPage + queryString;
			}
			else {
                var tempRequest = new Request.LBP({
					'url':	baseUrl + '?offset=' + (pageNumber-1)*perPage + queryString,
					'caller': caller
				}).send('sendby=' + caller + '&dmode=html_ajax');
			}
		}
		else {
			alert('Invalid page number');
		}
	},

	processScripts: function(html){
        var insideScript;

		// we will strip the script tag
		var insideScript;
        var extraHtml = html.stripScripts(function(script){
			insideScript = script;
		});
		// then run
		$exec(insideScript);
	},

	distributeHTML: function(responseString){
		// decode the response text to array
        try {
			var responseArr = JSON.decode(responseString);
			// then distribute to each element
			$each(
				responseArr,
				function(elementData, elementID, arr){
					if ($(elementID)){
						var injectMode = elementData['inject'];
						var newHTML = elementData['html'];
						var oldHTML = $(elementID).get('html');

	                    if (injectMode == 'destroy'){
							$(elementID).destroy();
						}
						else if (newHTML && newHTML != ''){
			                if (injectMode == 'before'){
					            $(elementID).set('html', newHTML + oldHTML);
							}
					        else if (injectMode == 'after'){
					            $(elementID).set('html', oldHTML + newHTML);
							}
			                else {
                    			// overwrite case is default
								$(elementID).set('html', newHTML );
							}
                            $(elementID).fireEvent('onReLoad');
							LBP.processScripts( newHTML );
						}
					}
					else {
						LBP.processScripts( elementData['html'] );
					}
				}
	        );
        } catch (e) {
            window.fireEvent('onError', [responseString,'errorbx', 'Có lỗi: line '+e.lineNumber+' \273 '+e.message]);
        }
	},

	submitLink: function(linkElement){
		if (LBP.Links.isAttached(linkElement)){
			LBP.Links.forceSubmitLink(linkElement);
		}
		else {
			window.location.href = linkElement.href;
		}
	},

    submitForm: function(formElement, clickedName){
        if (LBP.Forms.isAttached(formElement)){
        	LBP.Forms.forceSubmitForm(formElement, clickedName);
		}
		else {
			if (!clickedName){
	            var clickedButton = formElement.retrieve('clicked');
		        if (clickedButton && clickedButton != ''){
					if (!formElement.getElement('input[name=clicked]')){
						new Element(
							"input", {
							'type': 'hidden',
							'name': 'clicked',
							'value': clickedButton
						}).injectInside(formElement);
					}
					else {
						formElement.getElement('input[name=clicked]').value = clickedButton;
					}
				}
			}
			else {
				if (!formElement.getElement('input[name=clicked]')){
					new Element(
						"input", {
						'type': 'hidden',
						'name': 'clicked',
						'value': clickedName
					}).injectInside(formElement);
				}
				else {
					formElement.getElement('input[name=clicked]').value = clickedName;
				}
			}
            formElement.submit();
		}
	},

	addProcess: function(process, makeFirst, queueName){
		if (!queueName){
			queueName = '';
		}

		var queueArrayName = queueName + 'LBPEvents';
		var LBPEvents = window.retrieve(queueArrayName);
		if (LBPEvents == null){
			LBPEvents = new Array();
		}

		if (makeFirst){
			/*
			 * this will make the process first in the list, use this when we have to add a process to call a request
			 */
			xEvents = new Array();
			xEvents.include(process);
			xEvents.combine(LBPEvents);
			LBPEvents = xEvents;
		}
		else{
			LBPEvents.include(process);
		}
		window.store(queueArrayName, LBPEvents);
	},

	removeProcess: function(process, queueName){
    	if (!queueName){
			queueName = '';
		}

		var queueArrayName = queueName + 'LBPEvents';
		var LBPEvents = window.retrieve(queueArrayName);
		if (LBPEvents)
		{
			LBPEvents.erase(process);
		}
		window.store(queueArrayName, LBPEvents);
	},

	runProcesses: function(queueName){
        if (!queueName){
			queueName = '';
		}

		var queueArrayName = queueName + 'LBPEvents';
		var LBPEvents = window.retrieve(queueArrayName);
		if (LBPEvents != null){
			LBPEvents = $A(LBPEvents);
			$each(LBPEvents, function(fn){
				fn.run();
			});
		}
	},

    updateSession: function(newSession){
        Cookie.write('acc_sscode', newSession,
		{
			'domain': '.acc.vn',
			'path': '/'
		});
	},

	setReturnURL: function(lastLocation){
        Cookie.write('acc_last_url', lastLocation,
		{
			'domain': '.acc.vn',
			'path': '/',
			'duration': 1
		});
	},

	setCookie: function(key, value, day){
		Cookie.write(
			key,
			value,
			{
                'domain': '.acc.vn',
				'path': '/',
				'duration': day
			}
		);
	},

	getCookie: function(key){
		return Cookie.read(key);
	},

	fixPNG: function(){
		if (Browser.Engine.trident4){
			$$('.fixPNG').each(function(currentDiv){
				var backgroundURL = currentDiv.getStyle('background-image');
				var strLength = backgroundURL.length;
				backgroundURL = backgroundURL.substring(4, strLength - 1);
				currentDiv.setStyle('background-image', 'none');
				currentDiv.setStyle(
					'filter',
					"progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + backgroundURL + ", sizingMethod=scale)"
				);
			});
		}
	},

	scroll: function(elementId){
		var myFx = new Fx.Scroll(window).toElement(elementId);
	}
});

LBP.Forms = new Hash({

	isAttached: function(formElement){
		if (formElement.retrieve('managedByLBP')){
			return true;
		}
		else {
			return false;
		}
	},

	attachForm: function(formElement){
		formElement.store('managedByLBP', true);
		var specialFormEvent = function(event){
			event.preventDefault();
			LBP.Forms.forceSubmitForm(formElement);
		};

        /**
		*	event for submit buttons
		*/
		formElement.getElements('input[type=submit], button[type=submit]').each(function(thisButton){
			thisButton.addEvent('click', function(){
				formElement.store('clicked', thisButton.name);
			});
		});

		formElement.addEvent('submit', specialFormEvent);
	},

	detachForm: function(formElement){
		formElement.store('managedByLBP', false);
		formElement.removeEvents('submit');
	},

	forceSubmitForm: function(formElement, clickedName){
        if (!clickedName){
	        var clickedButton = formElement.retrieve('clicked');
		    if (clickedButton && clickedButton != ''){
				if (!formElement.getElement('input[name=clicked]')){
					new Element(
						"input", {
						'type': 'hidden',
						'name': 'clicked',
						'value': clickedButton
					}).injectInside(formElement);
				}
				else {
					formElement.getElement('input[name=clicked]').value = clickedButton;
				}
			}
		}
		else {
			if (!formElement.getElement('input[name=clicked]')){
				new Element(
					"input", {
					'type': 'hidden',
					'name': 'clicked',
					'value': clickedName
				}).injectInside(formElement);
			}
			else {
				formElement.getElement('input[name=clicked]').value = clickedName;
			}
		}

	    if (!formElement.getElement('input[name=sendby]')){
			new Element(
				"input", {
				'type': 'hidden',
				'name': 'sendby',
				'value': 'lbp'
			}).injectInside(formElement);
			var requestCaller = 'lbp';
		}
		else {
			var requestCaller = formElement.getElement('input[name=sendby]').value;
		}

        if (!formElement.getElement('input[name=dmode]')){
			new Element(
				"input", {
				'type': 'hidden',
				'name': 'dmode',
				'value': 'html_ajax'
			}).injectInside(formElement);
		}

		var tempRequest = new Request.LBP({
			method: 'post',
			url: formElement.action,
			data: formElement
		}).send();
	}
});

LBP.Links = new Hash({

	isAttached: function(linkElement){
        if (linkElement.retrieve('managedByLBP')){
			return true;
		}
		else {
			return false;
		}
	},

	attachLink: function(linkElement){
		linkElement.store('managedByLBP', true);
		var specialLinkEvent = function(event){
			event.preventDefault();
			LBP.Links.forceSubmitLink(linkElement);
		};
		linkElement.addEvent('click', specialLinkEvent);
	},

	detachLink: function(linkElement){
		linkElement.store('managedByLBP', false);
		linkElement.removeEvents('click');
	},

	forceSubmitLink: function(linkElement){
		var linkURL = linkElement.href;
		var linkCaller = linkElement.rev;

		if (!linkURL || linkURL == ''){
			linkURL = window.location.href;
		}

		if (!linkCaller || linkCaller == ''){
			linkCaller = 'lbp';
		}

		var tempRequest = new Request.LBP({
			'url':	linkURL,
			'caller': linkCaller
		}).send('sendby=' + linkCaller + '&dmode=html_ajax');
	}
});

window.addEvent('domready', function(){
	ourHM.register(
		'url',
		[],
		function(values) {
			if (values[0]) {
				var tempURL = values[0];
				var tempCaller = values[1];
				if (tempURL){
					var requestNow = function(){
						LBP.removeProcess(requestNow, 'after');
						var tempRequest = new Request.LBP({
							'url':	tempURL,
							'caller': tempCaller
						}).send('sendby=' + tempCaller + '&dmode=html_ajax');
					}
					LBP.addProcess(requestNow, false,'after');
				}
			} else {
				if (window.retrieve('canRefresh')) {
					window.location.href = window.location.href;
				} else {
					window.store('canRefresh', true);
				}
			}
		}.bind(this),
		function(values) {
			return ['url', '(', values[0], ',' , values[1] , ')' ].join('');
		}.bind(this),
		'url\\((.*),(.*)\\)'
	);

    ourHM.register(
		'scroll',
		[],
		function(values) {
			if (values[0]){
				var scrollNow = function(){
					LBP.removeProcess(scrollNow, 'after');
					if ($(values[0])){
	            		var myFx = new Fx.Scroll(window).toElement(values[0]);
					}
				}
				LBP.addProcess(scrollNow, 'after');
			}
		}.bind(this),
		function(values) {
			return ['scroll', '(', values[0], ')' ].join('');
		}.bind(this),
		'scroll\\((.*)\\)'
	);
});