YAHOO.namespace('faces');

YAHOO.faces.init = function() {
		
	//Vars
	var colors = YAHOO.util.Dom.getElementsByClassName('color');
	var frames = YAHOO.util.Dom.getElementsByClassName('frame');
	
	//Functions
	var transformPath = function(elements, attr, prefix, id) {
		for (var i = 0; i < elements.length; i++) {
			if (elements[i].getAttribute(attr).match('/' + prefix + '/') != null) {
				var re = new RegExp(prefix + '\/\\d+');
				elements[i].setAttribute(attr, elements[i].getAttribute(attr).replace(re, prefix + '/' + id));		
			} else {
				elements[i].setAttribute(attr, elements[i].getAttribute(attr) + '/' + prefix + '/' + id);
			}
		}		
	}
	
	var updateForm = function(elementId, newValue) {
		var inputs = document.getElementsByTagName('input');
		for (var i = 0; i < inputs.length; i++) {
			if ((inputs[i].id.match(elementId) != null) && (inputs[i].value != 0)) {
				YAHOO.util.Dom.get(inputs[i]).value = newValue;
			}
		}
	}
	
	var setProductImage = function(imageId, targetId) {		
		var root = 'bd';
		if (targetId) {
			var root = targetId;
			var num = targetId.match(/\d+/)
			if (num != null) {
				updateForm('itemImage' + num, imageId);
			} else {
				updateForm('itemImage', imageId);
			}
		}
		productImages = YAHOO.util.Dom.getElementsByClassName('product-image', 'img', root);
		if (productImages.length > 0) {
			transformPath(productImages, 'src', 'id', imageId);
			return productImages;			
		} else {
			return false;
		}		
	};
	
	var setProductLink = function(imageId, targetId) {
		var root = 'bd';
		if (targetId) {
			var root = targetId;
		}
		productLinks = YAHOO.util.Dom.getElementsByClassName('product-link', 'a', root);
		if (productLinks.length > 0) {
			transformPath(productLinks, 'href', 'image', imageId);
			return productLinks;
		} else {
			return false;
		}		
	};
	
	//Init menubar
	if (YAHOO.util.Dom.inDocument('menubar')) {
		var menubar = new YAHOO.widget.MenuBar('menubar', {
			autosubmenudisplay: true,
			hidedelay: 750,
			lazyload: true
		});
		menubar.render();
		menubar.show();
	}

	//Init carousel

	if (YAHOO.util.Dom.inDocument('carousel')) {		
		var products = YAHOO.util.Dom.getElementsByClassName('product');
		if (products.length > 0) {
			for (var i = 0; i < products.length; i++) {
				var ddTarget = new YAHOO.util.DDTarget(products[i].id, 'default');			
			}
		}
		var images = [];
			
	    var getImageTag = function(img, index) {
	        var imageTag = '<img src="/image/show/id/' + img.id + '/width/150/height/120" id="' + img.id + '" alt="' + index + '" title="Dobbeltklikk for å vise større" />';
			if (img.priority == 1) {
				imageTag += '<img src="http://lib.fame.no/icons/silk/1.3/star.png" title="Fotografens favoritt" class="favorite" />';
			}
	    	return imageTag;
		}	
					
		YAHOO.util.Connect.asyncRequest("GET", "/image/json", {
		    success: function (o) {
				images = YAHOO.lang.JSON.parse(o.responseText).images;
				var limit = 5;
				var curpos = limit;		
				var initialSelect = true;	
				var carousel = new YAHOO.widget.Carousel('carousel', {
						numItems: images.length,
						numVisible: (limit - 1),
						revealAmount: 25,
						isCircular: true,
						isVertical: true,
						selectOnScroll: false,
						animation: {speed: 0.5}
					});						
				carousel.STRINGS.ITEM_LOADING_CONTENT = '';
				carousel.CONFIG.MAX_PAGER_BUTTONS = 9;
				carousel.render();
				carousel.show();				
		        carousel.on("loadItems", function (o) {
                    var i = curpos,
                    	j = 0,
                        r = images.slice(i, (i + limit));
                        
                    curpos += r.length;
                    while (i < curpos) {
                        if (r[j]) {
                            this.addItem(getImageTag(r[j], i));
                        } else {
                            break;
                        }
                        i++;
                        j++;
                    }
		        });
				carousel.on("itemAdded", function (o) {
					var ddProxy = new YAHOO.util.DDProxy(this.getElementForItem(o.newPos).firstChild.id, 'default', {
						dragElId: 'dd-proxy',
						isTarget: false
					});	
					ddProxy.startDrag = function() {
						YAHOO.util.Dom.get(this.dragElId).src = YAHOO.util.Dom.get(this.id).src;
						YAHOO.util.Dom.setStyle(this.dragElId, 'opacity', 0.75);
						YAHOO.util.Dom.setStyle(this.dragElId, 'visibility', 'visible');
						var targets = YAHOO.util.DDM.getRelated(this, true);
						for (var i = 0; i < targets.length; i++) {
							YAHOO.util.Dom.setStyle(targets[i].getEl(), 'border-color', '#aa3');
						}
					};
					ddProxy.onDragDrop = function(e, id) {
						links = setProductLink(this.id, id);
						if (links) {
							window.location = links[0].href;
						} else {
							setProductImage(this.id, id);
						}
					};
					ddProxy.endDrag = function() {
						YAHOO.util.Dom.setStyle(this.dragElId, 'visibility', 'hidden');						
						var targets = YAHOO.util.DDM.getRelated(this, true);
						for (var i = 0; i < targets.length; i++) {
							YAHOO.util.Dom.setStyle(targets[i].getEl(), 'border-color', 'white');
						}				
					};
					YAHOO.util.Event.addListener(this.getElementForItem(o.newPos), "dblclick", function(e) {
						setLightboxImage(this.firstChild.alt);
						lightboxDialog.show();
					});
				});			
				carousel.on("itemSelected", function(index) {
					if (initialSelect) {
						initialSelect = false;
					} else if (YAHOO.util.Dom.inDocument('shop')) {
						setProductImage(images[index].id);
						setProductLink(images[index].id);						
					}
				});
				for (var i = 0; i < limit; i++) {
					if (images[i]) {
						carousel.addItem(getImageTag(images[i], i));	
					}               		
            	}				
		    },
		    failure: function (o) {}
		});	
		
		//Init lightbox
		if (YAHOO.util.Dom.inDocument('lightbox')) {
			var selectedLightboxImage = 0;
			var setLightboxImage = function(index) {				
				var imageElement = YAHOO.util.Dom.get('lightbox-image');
				var titleElement = YAHOO.util.Dom.get('lightbox-title');
				imageElement.src = '';
				titleElement.innerHTML = '';
				if (index != null) {
					selectedLightboxImage = index;
					imageElement.src = '/image/show/id/' + images[index].id;						
					titleElement.innerHTML = 'Bilde ' + (parseInt(index) + 1) + ': ' + images[index].name;
				}
			};
			var handlePrev = function() {
				if ((selectedLightboxImage - 1) < 0) {
					selectedLightboxImage = (images.length - 1);
				} else {
					selectedLightboxImage--;
				}				
				setLightboxImage(selectedLightboxImage);
			};
			var handleNext = function() {
				if ((parseInt(selectedLightboxImage) + 1) == images.length) {
					selectedLightboxImage = 0;
				} else {
					selectedLightboxImage++;
				}
				setLightboxImage(selectedLightboxImage);
			};
			var lightboxDialog = new YAHOO.widget.Dialog("lightbox", { 
				width: '620px',
				height: '690px',
				fixedcenter: false, 
				constraintoviewport: true,
				close: true, 
				visible: false, 
				draggable: false,
				modal: true,
			    effect: {effect:YAHOO.widget.ContainerEffect.FADE, duration: 0.25},
				buttons: [ 
					{text:"< Forrige", handler:handlePrev},
					{text:" Neste >", handler:handleNext}
				]			 
			});
			lightboxDialog.render();
			lightboxDialog.center();
		}
	}

	//Init color picker
	if (colors.length > 0) {
		var colorTargets = YAHOO.util.Dom.getElementsByClassName('color-target');
		if (colorTargets.length > 0) {
			YAHOO.util.Event.addListener(colors, "click", function() {
				updateForm('itemColor', this.alt);
				transformPath(colorTargets, 'src', 'color', this.alt);
			});
		}
	}
	
	//Init frame picker
	if (frames.length > 0) {
		var frameTargets = YAHOO.util.Dom.getElementsByClassName('frame-target');
		if (frameTargets.length > 0) {
			YAHOO.util.Event.addListener(frames, "click", function() {
				for (var i = 0; i < frameTargets.length; i++) {
					updateForm(('itemFrame' + frameTargets[i].name), this.alt);
				}				
				transformPath(frameTargets, 'src', 'frame', this.alt);
			});
		}
	}
	
	//Init color toggle
	var colorToggles = YAHOO.util.Dom.getElementsByClassName('color-toggle');
	YAHOO.util.Event.addListener(colorToggles, "click", function() {
		updateForm(('itemColor' + this.name), this.alt)
		transformPath([this.nextSibling], 'src', 'color', this.alt);
		if (this.alt == 2) {
			this.src = '/images/color_wheel.png';
			this.title = 'Bytt til fullfarge'; 
			this.alt = 1;
		} else {
			this.src = '/images/color_bw.png';
			this.title = 'Bytt til sort-hvitt'; 
			this.alt = 2;				
		}
	});
	
	//Init background toggle
	var backgroundToggles = YAHOO.util.Dom.getElementsByClassName('background-toggle');
	var backgrounds = [7, 8, 9, 10, 11];
	YAHOO.util.Event.addListener(backgroundToggles, "click", function() {
		for (var i = 0; i < backgrounds.length; i++) {
			if (backgrounds[i] == this.alt) {
				if (i == (backgrounds.length - 1)) {
					this.alt = backgrounds[0];
				} else {
					this.alt = backgrounds[i + 1];
				}
				break;
			}
		}
		updateForm(('itemFrame' + this.name), this.alt)
		transformPath([this.previousSibling], 'src', 'frame', this.alt);
	});
	
	//Init itemAdd
	var itemAddButtons = YAHOO.util.Dom.getElementsByClassName('itemAddButton');
	YAHOO.util.Event.addListener(itemAddButtons, "click", function() {
		YAHOO.util.Connect.setForm(this.parentNode.parentNode.parentNode);
		var request = YAHOO.util.Connect.asyncRequest('POST', '/basket/add', {
			success: function(o){
				var panelBasket = new YAHOO.widget.Panel("panel-basket", {
					width: '130px',
					visible: false,
					draggable: false,
					close: false,
					effect: {
						effect: YAHOO.widget.ContainerEffect.FADE,
						duration: 0.25
					},
					context: ['menu-basket', 'tl', 'bl']
				});
				panelBasket.setBody('Varen er lagt i handlekurven');
				panelBasket.render();
				panelBasket.show();
				YAHOO.lang.later(3000, panelBasket, function(){
					this.hide();
				})
			}
		}); 
	});

	
	//Init datatables
	
	//Datatable basket
	if ((YAHOO.util.Dom.inDocument('datatable-basket')) || (YAHOO.util.Dom.inDocument('datatable-items'))) {
		if (YAHOO.util.Dom.inDocument('datatable-items')) {
			var dsPath = '/order/json/id/' + location.href.substring(location.href.lastIndexOf('/')+1);
			var containerId = 'datatable-items';
		} else {
			dsPath = '/basket/json';
			containerId = 'datatable-basket';			
		}
		var dataSource = new YAHOO.util.XHRDataSource(dsPath, {
			responseType: YAHOO.util.XHRDataSource.TYPE_JSON,
			responseSchema: {
				resultsList: 'items',
			    fields: [
					{key:'item'},
				    {key:'image'},				    
					{key:'product'},
					{key:'color'},
					{key:'frame'},
					{key:'qty'},
					{key:'price'},
					{key:'package'},
					{key:'control'}
			    ]
			}		
		});
		var dataTable = new YAHOO.widget.DataTable(containerId,
			[
				{key:'image', label:'Bilde'},				
				{key:'color', label:'Fargetone'},
				{key:'product', label:'Produkt'},
				{key:'frame', label:'Ramme / Mal'},
				{key:'qty', label:'Antall'},
				{key:'price', label:'Pris (NOK)'},
				{key:'control', label:''}
			], 
			dataSource,
			{
				initialRequest:'/json',
	            MSG_EMPTY: 'Handlekurven er tom'
			}
		);
	}
	
	//Datatable friends
	if (YAHOO.util.Dom.inDocument('datatable-friends')) {
		var dataSource = new YAHOO.util.XHRDataSource('/friend', {
			responseType: YAHOO.util.XHRDataSource.TYPE_JSON,
			responseSchema: {
				resultsList: 'friends',
			    fields: [
					{key:'name'},
					{key:'email'},
					{key:'disable'}
			    ]
			}		
		});
		var dataTable = new YAHOO.widget.DataTable('datatable-friends',
			[
				{key:'name', label:'Navn'},
				{key:'email', label:'E-postadresse'},
				{key:'disable', label:' '}
			], 
			dataSource,
			{
				initialRequest:'/json',
	            MSG_EMPTY: 'Du har ikke invitert noen ennå'
			}
		);
	}
	
	//Datatable orders
	if (YAHOO.util.Dom.inDocument('datatable-orders')) {
		var dataSource = new YAHOO.util.XHRDataSource('/order', {
			responseType: YAHOO.util.XHRDataSource.TYPE_JSON,
			responseSchema: {
				resultsList: 'orders',
			    fields: [
					{key:'id'},
					{key:'price'},
					{key:'placed'},
					{key:'paid'},
					{key:'control'}
			    ]
			}		
		});
		var dataTable = new YAHOO.widget.DataTable('datatable-orders',
			[
				{key:'id', label:'Ordrenr.'},
				{key:'price', label:'Pris (NOK)'},
				{key:'placed', label:'Bestilt'},
				{key:'paid', label:'Betalt'},
				{key:'control', label:''}
			], 
			dataSource,
			{
				initialRequest:'/json',
	            MSG_EMPTY: 'Vi har ikke mottatt noen ordre fra deg'
			}
		);
	}
	
	//Init panels
	var panelContainers = YAHOO.util.Dom.getElementsByClassName('panel');
	var panels = [];
	for (var i = 0; i < panelContainers.length; i++) {
		panels[i] = new YAHOO.widget.Panel(panelContainers[i], { 
			width: '500px',
			fixedcenter: false, 
			constraintoviewport: true,
			close: true, 
			visible: false, 
			draggable: false,
			modal: true,
		    effect: {effect:YAHOO.widget.ContainerEffect.FADE, duration: 0.25}
		});
		panels[i].render();
		panels[i].center();		
	}	
	var panelTriggers = YAHOO.util.Dom.getElementsByClassName('panel-trigger');
	for (var i = 0; i < panelTriggers.length; i++) {
		YAHOO.util.Event.addListener(panelTriggers[i], "click", function() {
			for (var i = 0; i < panels.length; i++) {
				if (this.id.match(panels[i].id) != null) {
					panels[i].show();
					break;
				}
			}
		});
	}			
	
	//Accept terms
	if (YAHOO.util.Dom.inDocument('accept-terms')) {
		YAHOO.util.Dom.get('accept-terms').checked = false;
		YAHOO.util.Event.addListener('accept-terms', 'click', function() {
			if (YAHOO.util.Dom.getStyle('payform', 'visibility') == 'hidden') {
				YAHOO.util.Dom.setStyle('payform', 'visibility', 'visible');
			} else {
				YAHOO.util.Dom.setStyle('payform', 'visibility', 'hidden');
			}			
		});
	}
	
	//Focus on username
	if (YAHOO.util.Dom.inDocument('username')) {
		YAHOO.util.Dom.get('username').focus();
	}	
};

YAHOO.util.Event.onDOMReady(YAHOO.faces.init);