/*
	Copyright (c) 2006-2007, ePages GmbH
	All Rights Reserved.

	epages.cartridges.de_epages.mediagallery.widget.Imagedbstore $Revision: 1.7 $

*/
dojo.provide("epages.cartridges.de_epages.mediagallery.widget.Imagedbstore");
dojo.require('dojo.data.api.Identity');
dojo.require('dojo.data.util.simpleFetch');
dojo.require("epages.io.translation");
dojo.require("epages.io.xml");
dojo.require("epages.lang.array");
dojo.require("epages.html");
dojo.require('epages.lang.hash');

dojo.declare(
	"epages.cartridges.de_epages.mediagallery.widget.Imagedbstore",
	[dojo.data.api.Identity], {
		/**
		* public properties
		*/
		id                : 'Imagedbstore',
		basePath          : epages.vars.ImageDbRoot,
		originalPath      : epages.vars.ImageDbRoot + "/original",
		previewPath       : epages.vars.ImageDbRoot + "/thumbnail",
		translationFile   : "content",
		contentFileName   :  "content.xml",

		/**
		* private properties
		*/
		_XmlIo:           undefined,
		_translation:     undefined,
		_keywords:        undefined,

		constructor: function(keywordParameters){
			dojo.mixin(this,keywordParameters);
			this._XmlIo = new epages.io.Xml();
			this._translation = new epages.io.Translation();
			this._keywords = $H();
			if(this.basePath){
				this._translation.loadLocale(this.basePath + '/' + this.translationFile);
			}else{
				console.warn("epages.vars.ImageDbRoot not defined in "+this.declaredClass);
			}
		},

		/**
		 * private methods
		 */
		_getCategories: function(parentNode) {
			var categories = [];
			if (parentNode.childNodes.length > 0) {
				var categoryNodes = epages.html.getChildNodesByTagName(parentNode, "category");
				for( var i=0,iLength=categoryNodes.length ; i<iLength ; i++ ) {
					var categoryNode = categoryNodes[i];
					var keyword = categoryNode.getAttribute("name");
					var children = this._getCategories(categoryNode);
					categories.push({
						title: this._translation.get(keyword),
						objectId: keyword,
						children: children.length >0 ? children : undefined,
						isFolder: children.length > 0 ? 1 : 0
					});
				}
			}
			return categories;
		},

		_getCollections: function(collectionsNode) {
			var collectionNodes = epages.html.getChildNodesByTagName(collectionsNode, "collection");
			for( var i=0,iLength=collectionNodes.length ; i<iLength ; i++ ) {
				var collection = {
					directory: collectionNodes[i].getAttribute("dir"),
					content:   collectionNodes[i].getAttribute("content")
				};
				var keywordNodes = epages.html.getChildNodesByTagName(collectionNodes[i], "keyword");
				for( var j=0,jLength=keywordNodes.length ; j<jLength ; j++ ) {
					var keyword = keywordNodes[j].getAttribute("name");
					var keywordInfo = this._keywords.get(keyword);
					if (keywordInfo === undefined) {
						keywordInfo = {
							'files'      : [],
							'collections': []
						};
						this._keywords.set(keyword, keywordInfo);
					}
					keywordInfo.collections.push(collection);
				}
			}
		},

		_parse: function () {
			var contentXml = this._XmlIo.loadSync(this.basePath + '/' + this.contentFileName);
			if (contentXml === undefined){
				throw new Error('no content found');
			}

			var contentNode = contentXml.getElementsByTagName("content")[0];
			if (contentNode === undefined){
				throw new Error('no content node found');
			}

			var categoriesNode = contentNode.getElementsByTagName("categories")[0];
			if (categoriesNode === undefined){
				throw new Error('no categories node found');
			}

			var collectionsNode = contentNode.getElementsByTagName("collections")[0];
			if (collectionsNode === undefined){
				throw new Error('no collections node found');
			}

			var categories = this._getCategories(categoriesNode);
			this._getCollections(collectionsNode);
			return categories;
		},

		_fetchItems: function(keywordArgs, findCallback, errorCallback){

			if(typeof findCallback == 'function') {
				findCallback(this._parse(), keywordArgs);
			} else {
				consoleerror('error while _fetch');
				errorCallback(keywordArgs);
			}
		},

		hasAttribute: function(node, attributeName){
			//check if node has specified attribute
			return node[attributeName] !== undefined;
		},

		getLabel: function(item){
			if(item.title !== undefined){ 
				return item.title;
			}
			return undefined;
		},

		getIdentity: function(item){
			if(item.objectId !== undefined){ 
				return item.objectId;
			}
			return undefined;
		},

		getValues: function(item, attribute){
				return item[attribute];
		},

		isItemLoaded: function(something){
			return true;
		},
		/**
		* public methods
		*/
		parseFiles: function(keyword) {
			var keywordInfo = this._keywords.get(keyword);
			// keyword has no files, possible main category
			if (keywordInfo === undefined){ 
				return [];
			}

			// load file names
			var keywordCollections = $A(keywordInfo.collections).grep( function () {return true;});
			for( var i=0,iLength=keywordCollections.length ; i<iLength ; i++ ) {
				var collection = keywordCollections[i];
				var filedir = collection.directory;
				var content = collection.content;
				var contentXml = this._XmlIo.loadSync(this.basePath + '/' + content);
				if (contentXml === undefined){
					throw new Error('no content found');
				}

				var keywordNodes = contentXml.getElementsByTagName("keyword");
				if (keywordNodes === undefined){
					throw new Error('no keywords node found');
				}

				for( var i=0,iLength=keywordNodes.length ; i<iLength ; i++ ) {
					var locKeyword = keywordNodes[i].getAttribute("name");
					var locInfo = this._keywords.get(locKeyword);
					var locFiles = locInfo.files;
					locInfo.collections = $A(locInfo.collections).grep(function (el) {
						return el.content != content;
					});
					var fileNodes = epages.html.getChildNodesByTagName(keywordNodes[i], "file");
					for( var j=0,jLength=fileNodes.length ; j<jLength ; j++ ) {
						var fileName = fileNodes[j].firstChild.data;
						if (fileName != "") {
							if (fileName.lastIndexOf(".") == -1) {
								var extension = "?";
							} else {
								var extension = fileName.substring(fileName.lastIndexOf(".") + 1);
							}
							locFiles.push({
								objectId:     (this.originalPath + "/" + collection.directory + "/" + fileName),
								title:         fileName,
								fullpath:     (this.originalPath + "/" + collection.directory + "/" + fileName),
								preview:      (this.previewPath + "/" + collection.directory + "/" + fileName),
								extension:    extension,
								size:         0,
								mimetype:     "",
								imagewidth:   "",
								imageheight:  "",
								modified:     0,
								templateType: 'image'
							});
						}
					}
				}
			}
			return keywordInfo.files;
		},

		getCurrentPath: function(node) {
			var path=node.title;
			while(node.parent.title) {
				node=node.parent;
				path = node.title+'/' + path;
			}
			return path;
		}
	}
);

dojo.extend(epages.cartridges.de_epages.mediagallery.widget.Imagedbstore,dojo.data.util.simpleFetch);