/**
 * wrapper namespace for ckEditor
 */
CreatoorSN.namespace('ckeditor');
CreatoorSN.ckeditor = {
	
	remoteThumbnailSize: 200,
	imageSize: 350,
	videoWidth: 350,
	videoHeight: 212,
	
	activated : false,
	activeInstance : null,
	
	//object holding the default editor configuration
	defaultConfig: {
	    on: {
			instanceReady: function (e) {
				CreatoorSN.ckeditor.editors[e.editor.name].ready = true;
				CreatoorSN.ckeditor.editors[e.editor.name].editorContainer = _$('cke_' + e.editor.name);
				CreatoorSN.ckeditor.editors[e.editor.name].position = absolutePosition(CreatoorSN.ckeditor.editors[e.editor.name].editorContainer);
				if (CKEDITOR.env.webkit) {
                    if (CreatoorSN.ckeditor.editors[e.editor.name].config.fixWidth) {
                        CreatoorSN.ckeditor.editors[e.editor.name].execCommand('source');
                        setTimeout(function () {CreatoorSN.ckeditor.editors[e.editor.name].execCommand('source');}, 500);
                        CreatoorSN.ckeditor.editors[e.editor.name].blur();
                    }
					
				}
                /*if (CKEDITOR.env.ie) {
                    var editorArea = _$('cke_contents_' + e.editor.name);
                    if (editorArea) {
                        alert(editorArea);
                        editorArea.onclick = function() {
                            alert('oncontextmenu');
                        }
                    }
                }*/
				CreatoorSN.ckeditor.editors[e.editor.name].dataProcessor.writer.selfClosingEnd = ' />';
				CreatoorSN.ckeditor.editors[e.editor.name].dataProcessor.writer.setRules('p', {
					indent: false,
					breakBeforeOpen: false,
					breakAfterOpen: false,
					breakBeforeClose: false,
					breakAfterClose: false
				});
                //
                
                //CreatoorSN.ckeditor.editors[e.editor.name].on('focus', function (e){alert('focus');});
			},
			instanceDestroyed: function (e) {
				delete CreatoorSN.ckeditor.editors[e.editor.name];
			}
		},
		language: 'sl',
		toolbar: [
			['Undo', 'Redo', '-', 'Bold','Italic', 'Format', '-', 'JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock', '-', 'NumberedList','BulletedList','-','TextColor','BGColor', '-', 'CsnLink', 'Unlink', 'CsnAnchor', '-', 'Youtube', 'Media','CsnSmiley', 'Dictionary']
		],
		contentCss: '/css/style.css',
        autoGrow_maxHeight: 0

	},
	
	//object holding configuration for attaching media
	mediaConfig: {
		
	},
	
	editors: {},
	smileys: [],
	userLinks: null,
	buttonStyle: {
		backgroundColor: '#9AC038',
        color: '#fff',
        padding: '2px 5px',
        border: '1px solid #888888',
        cursor: 'pointer'
	},
	
	/**
	 * initialize an editor instance
	 * 
	 * @param {string} id      - id of the textarea that should be replaced by the editor - required
	 * @param {Object} config  - ck editor config - look at the ckEditor documentation for more info (http://docs.cksource.com/CKEditor_3.x/Developers_Guide)
	 * @param {Object} mediaConfig - config for attaching media files {imageSize, videoWidth, videoHeight} 
	 */	
	initialize: function (id, config, mediaConfig) {
	   if (config && typeof(config) == 'object') {
	       for (x in CreatoorSN.ckeditor.defaultConfig) {
                if (!config[x]) {
                    config[x] = CreatoorSN.ckeditor.defaultConfig[x];
                }
            }
	   } else {
	       config = CreatoorSN.ckeditor.defaultConfig;
	   }
	   config.fontSize_sizes =	CreatoorSN.common.translate('small') + '/.8em;' + CreatoorSN.common.translate('normal') + '/1em;' + CreatoorSN.common.translate('title') + '/1.3em';
	   config.format_tags = 'p;h3;h4';
	   
	   CreatoorSN.ckeditor.editors[id] = CKEDITOR.replace(id, config);
	   //CreatoorSN.ckeditor.editors[id].insertHtml('<img src="/images/become-a-member.png" />');
	   CreatoorSN.ckeditor.editors[id].ready = false;
	   mediaConfig = mediaConfig ? mediaConfig : CreatoorSN.ckeditor.mediaConfig;
	   CreatoorSN.ckeditor.editors[id].mediaConfig = mediaConfig;
	   return CreatoorSN.ckeditor.editors[id];
	},
	
	destroy: function (id) {
		CreatoorSN.ckeditor.editors[id].destroy();
		delete CreatoorSN.ckeditor.editors[id];
	},
	
	/**
	 * show dialog for inserting youtube videos
	 * @param {Object} editor
	 */
	youTubeDialog: function (editor, posObj) {
		if (_$('youtube' + editor.name)) {
			removeElement('youtube' + editor.name);
			return;
		}
		var width = CKEDITOR.env.ie && CKEDITOR.env.version < 8 ? '265px' : '275px';
		var mediaUrlInput = new creaDomInput({
            type: 'text',
            name: 'url',
            value: 'http://',
            className: 'editor-url-input',
            style: {
				width: width,
                border: '1px solid #D3D3D3',
                marginTop: '5px',
				padding: '2px'
			},
            wrapper: {
                tag: 'div',
                params:{style: {marginRight: '5px'}, className: 'left'}
            }
        });
		
        
        var checkButton = new creaDomInput({
            type: 'submit',
            name: 'check',
            value: 'go',
            style: CreatoorSN.ckeditor.buttonStyle,
            wrapper: {
                tag: 'div',
                params: {style: {className: 'left', paddingTop: '4px'}}
            }
        });
        
        
        var clear = new creaDomObject({tag:'div', className: 'clear'});
        
        var checkUrlForm = new creaDomForm({
            name: 'checkUrl',
            wrapper: {
                tag: 'div'
            },
            elements: [mediaUrlInput, checkButton, clear]
        });                 
        
        var descriptionDiv = new creaDomObject({
            tag: 'div',
            style: {
        		border: '#808080 1px solid',
        		margin: '5px 0px',
        		padding: '5px'
        	},
            html: CreatoorSN.common.translate('ready') + '...'
            
        });
		var insertButton = new creaDomInput({
            type: 'button',
            value: CreatoorSN.common.translate('Insert'),
            style: CreatoorSN.ckeditor.buttonStyle,
            disabled: true            
        });
		
		insertButton.domElement.style.marginRight = '5px';
		
		var cancelButton = new creaDomInput({
			type: 'button',
			value: CreatoorSN.common.translate('Close'),
			style: CreatoorSN.ckeditor.buttonStyle
		});
		var buttonDiv = new creaDomObject({
			tag: 'div',
			style: {textAlign: 'center'},
			elements: [insertButton, cancelButton]
		});
		zIndex++;
		var _height = CKEDITOR.env.ie ? CreatoorSN.ckeditor.editors[editor.name].editorContainer.offsetHeight  : CreatoorSN.ckeditor.editors[editor.name].editorContainer.clientHeight;
		var _position = absolutePosition(posObj);
		var _cPosition = absolutePosition(CreatoorSN.ckeditor.editors[editor.name].editorContainer);
		var marginTop = '-' + parseInt(_height - (posObj.clientHeight + (_position.y - _cPosition.y)));        
        var marginLeft = _position.x - _cPosition.x;
		var container = new creaDomObject({
            tag: 'div',
            id: 'youtube' + editor.name,
            style: {
				marginTop: marginTop + 'px',
				marginLeft: marginLeft + 'px',
				position: 'absolute',
				zIndex: zIndex,
				display: 'block',
				backgroundColor: '#fff',
				width: '320px',
				padding: '5px',
				border: '2px solid #D3D3D3'
			},
			elements: [checkUrlForm, descriptionDiv, buttonDiv]
        });
		cancelButton.domElement.onclick = function () {			
	        removeElement(container);
		};
		checkUrlForm.on('submit', CreatoorSN.ckeditor.checkUrl, {container: container, type: 'youtube', editor: editor, description: descriptionDiv, insert: insertButton});
		addAfter(container, CreatoorSN.ckeditor.editors[editor.name].editorContainer);
		mediaUrlInput.domElement.focus();
		container.domElement.onclick = function () {
			zIndex++;
			this.style.zIndex = zIndex;
		};
	},
	checkUrl : function(params, form) {
        var overlay = disableElement(params.container);
        var url = trim(form.getValues().url);
        var urlInput = form.getFormElement('url').url[0];
        params.description.domElement.innerHTML = CreatoorSN.common.translate('checking') + '...';
        if (!url || url == 'http://') {
            removeElement(overlay);
            params.description.domElement.innerHTML = CreatoorSN.common.translate('Enter valid url.');
            return false;
        }       
        var oCallback = {                
        success : function (o) {
        	removeElement(overlay);
            if (YAHOO.lang.JSON.isSafe(o.responseText)) {
                var response = YAHOO.lang.JSON.parse(o.responseText);
                if (response.success) {
                    params.insert.domElement.disabled = false;
                    switch (response.type) {
                        case 'image':
                          params.insert.domElement.onclick = function()
                          {
                            CreatoorSN.ckeditor.insertRemotePhoto(response, params.editor, params.container);
                          };
                        break;
                        case 'video':
                        break;
                        case 'youtube':
                          params.insert.domElement.onclick = function()
                          {
                            CreatoorSN.ckeditor.insertYoutubeVideo(response, params.editor, params.container);
                          };
                        break;
                        
                    }
                    params.description.domElement.innerHTML = '';
                    response.editor = params.editor;
                    CreatoorSN.ckeditor.showUrlDetails(response).addTo(params.description);
                } else {
                    if (response.noAuth) {
                        var login = new noAuth(function (noAuthObj){
                            CreatoorSN.ckeditor.checkUrl(params, form);
                        }, response.message);
                        return;
                    }
                    params.description.domElement.innerHTML = response.message;
                    urlInput.value = 'http://';
                    params.insert.domElement.disabled = true;
                }
            } else {
                params.description.domElement.innerHTML = CreatoorSN.common.translate('neznana napaka');
            }             
        },      
        
        failure : function (o) {
        	removeElement(overlay);
            params.description.domElement.innerHTML = o.statusText;
        },
        timeout: CreatoorSN.common.iAjaxTimeout
        
        };
        YAHOO.util.Connect.asyncRequest(
            "GET",
            "/members/ajax/check-editor-url/?url=" + encodeURIComponent(url),
            oCallback
        ); 
        return false;
    },
	
	showUrlDetails : function (data) {
            
        if (data.type == 'image' || (data.type == 'youtube' && data.thumbnail)) {
            if (data.type == 'image') {
                var width = parseInt(data.width);
                var height = parseInt(data.height);
                var src = data.url;
            } else {
                var width = parseInt(data.thumbnail.width);
                var height = parseInt(data.thumbnail.height);
                var src = data.thumbnail.url;
            }
            if (width >= height) {
            	if (width > CreatoorSN.ckeditor.remoteThumbnailSize) {
                    height = Math.round((CreatoorSN.ckeditor.remoteThumbnailSize * height) / width);
                    width = CreatoorSN.ckeditor.remoteThumbnailSize;
                }
            } else if (height > CreatoorSN.ckeditor.remoteThumbnailSize) {
                width = Math.round((width / height) * CreatoorSN.ckeditor.remoteThumbnailSize);
                height = CreatoorSN.ckeditor.remoteThumbnailSize;
            }
            var previewImg = new creaDomObject({
                tag: 'img',
                alt: 'preview',
                src: src,
                width: width,
                height: height
            });
        } else {
            var previewImg = new creaDomObject({tag: 'div', html: 'n/a'});
        }
        var preview = new creaDomObject({
            tag: 'div',
            className: 'editor-remote-preview',
            style: {textAlign: 'center'},
            label: {
                tag: 'div',                
                params: {html: 'predogled'}                
            },
            elements: [previewImg]               
        });
        var urlString = data.url.length > 43 ? data.url.substring(0, 43) + '...' : data.url;
        var dataHTML = '<strong>url:</strong><a href="' + data.url + '" target="_blank" title="' + data.url + '">' + urlString + '</a><br />';
        dataHTML += '<strong>tip:</strong> ' + data.type + '<br />';
        if (data.type != 'youtube') {
            dataHTML += '<strong>mime type:</strong> ' + data.mimeType + '<br />';
        }
        if (data.type == 'image') {
            dataHTML += '<strong>' + CreatoorSN.common.translate('width') + ':</strong> ' + 
                         data.width + ' px<br />';
            dataHTML += '<strong>' + CreatoorSN.common.translate('height') + ':</strong> ' +
                         data.height + ' px<br />';
        }
        if (data.type == 'youtube') {
            dataHTML += '<strong>' + CreatoorSN.common.translate('duration') + ':</strong> ' + 
                         data.duration  + '<br />';
        }
        dataHTML += '<strong>' + CreatoorSN.common.translate('size') + ':</strong> ' + data.size;
        var metaData = new creaDomObject({
            tag: 'div',
            html: dataHTML,
            label: {tag:'div', params:{html: CreatoorSN.common.translate('podatki')}}
        });
        var dataObj = new creaDomObject({
            tag: 'div',
            elements: [preview, metaData]
        });
        return dataObj;
    },
	insertRemotePhoto : function(data, editor, container) {
        var overlay = disableElement(container);
        var width = parseInt(data.width);
        var height = parseInt(data.height);
        var imgSize = editor.mediaConfig && editor.mediaConfig.imageSize ? editor.mediaConfig.imageSize : CreatoorSN.ckeditor.imageSize;  
        if (width >= height) {        	 
            if (width > imgSize) {
                height = Math.round((imgSize * height) / width);
                width = imgSize;
            }
        } else if (height > imgSize) {
            width = Math.round((width / height) * imgSize);
            height = imgSize;
        }
        var imgHTML = '<img src="' + data.url + '" alt="photo" width="' + width + '" height="' + height + '" /><br />';
        editor.insertHtml(imgHTML);
        removeElement(overlay);
        removeElement(container);
    },
    
    insertYoutubeVideo : function (data, editor, container) {
    	var overlay = disableElement(container);
    	var videoHeight = editor.mediaConfig && editor.mediaConfig.videoHeight ? editor.mediaConfig.videoHeight : CreatoorSN.ckeditor.videoHeight;
    	var videoWidth = editor.mediaConfig && editor.mediaConfig.videoWidth ? editor.mediaConfig.videoWidth : CreatoorSN.ckeditor.videoWidth;  
        var videoHTML = '<object width="' + videoWidth + '" height="' + videoHeight + '">' + 
		                '<param name="movie" value="' + data.media_content_url + '"></param>' + 
						'<param name="allowFullScreen" value="true"></param>' + 
						'<param name="allowscriptaccess" value="always"></param>' + 
						'<embed src="' + data.media_content_url + '" type="' + data.media_content_type + '" allowscriptaccess="always" allowfullscreen="true" width="' + videoWidth + '" height="' + videoHeight + '"></embed>' +
						'</object>';
        editor.insertHtml(videoHTML);
        removeElement(overlay);
        removeElement(container);
    },
	
	showSmileys: function (editor, posObj, overlay) {
    	if (editor.smileysOpened) {			
    		removeElement('smileys' + editor.name);
    		if (overlay) {
    			removeElement(overlay);
    		}
			editor.smileysOpened = false;
    		return;
		}
		if (!_$('smileys' + editor.name)) {
			zIndex++;
			var _height = CKEDITOR.env.ie ? CreatoorSN.ckeditor.editors[editor.name].editorContainer.offsetHeight  : CreatoorSN.ckeditor.editors[editor.name].editorContainer.clientHeight;
			var _position = absolutePosition(posObj);
			var _cPosition = absolutePosition(CreatoorSN.ckeditor.editors[editor.name].editorContainer);
			var marginTop = '-' + parseInt(_height - (posObj.clientHeight + (_position.y - _cPosition.y))); 
	        var _position = absolutePosition(posObj);
	        var marginLeft = _position.x - _cPosition.x;
			var smileysContainer = new creaDomObject({
				tag: 'div',
				id: 'smileys' + editor.name,
				className: 'ck-smiley-container',
				style: {
					marginTop: marginTop + 'px',
					marginLeft: marginLeft + 'px',
					position: 'absolute',
					zIndex: zIndex,
					display: 'block',
					backgroundColor: '#fff',
					width: '400px',
					padding: '5px',
					border: '2px solid #D3D3D3'
				}
			});
			addAfter(smileysContainer,CreatoorSN.ckeditor.editors[editor.name].editorContainer);
			
			smileysContainer.domElement.onclick = function () {
				zIndex++;
				this.style.zIndex = zIndex;
			};
			
		}
		if (!CreatoorSN.ckeditor.smileys.length) {
			overlay = disableElement(_$('smileys' + editor.name));
			CreatoorSN.ckeditor.getSmileys(editor, posObj, overlay);
		} else {
			if (overlay) {
				removeElement(overlay);
			}
			var smileys = _$('smileys' + editor.name);
			//console.log(CreatoorSN.ckeditor.smileys[0]);
			for (var i = 0; i < CreatoorSN.ckeditor.smileys.length; i++) {
				var smiley = new creaDomObject({
					tag: 'img',
					src: '/images/smiles/' + CreatoorSN.ckeditor.smileys[i],
					wrapper: {
						tag:'div',
						params: {
							className: 'smiley left',
							style: {
								height: '31px',
								width: '40px',
								textAlign: 'center',
								verticalAlign: 'middle'
							}
						}
					}
				});
				
				//func: CreatoorSN.categories.editCategories, params: cConfig[x], obj: addCategoryBtn.domElement
				setOnClick({func: CreatoorSN.ckeditor.insertSmiley, params:{editor: editor, smiley: '/images/smiles/' + CreatoorSN.ckeditor.smileys[i]}, obj: smiley.domElement});
				smiley.addTo(smileys);
				
			}
			var clear = new creaDomObject({tag: 'div', className: 'clear'});
			clear.addTo(smileys);
			var close = new creaDomInput({
				type: 'button',
				name: 'closeSmileys' + editor.name,
				style: CreatoorSN.ckeditor.buttonStyle,
				value: CreatoorSN.common.translate('close'),
				wrapper: {tag: 'div', params:{style:{textAlign: 'right', width: '100%'}}}
			});
			close.domElement.onclick = function () {
				removeElement(smileys);
				editor.smileysOpened = false;
				return false;
			};
			close.addTo(smileys);
			editor.smileysOpened = true;
		}
		
		
	},
	
	getSmileys: function (editor, posObj, overlay) {
		var gsCallback = {
			success: function (o) {
				if (YAHOO.lang.JSON.isSafe(o.responseText)) {
					var response = YAHOO.lang.JSON.parse(o.responseText);
					if (response.success) {
						CreatoorSN.ckeditor.smileys = response.smileys;
						CreatoorSN.ckeditor.showSmileys(editor, posObj, overlay);
					} else {
						removeElement(overlay);
                        removeElement('smileys' + editor.name);
						CreatoorSN.common.showErrorAlert(response.message);
					}
				} else {
					removeElement(overlay);
					removeElement('smileys' + editor.name);
					CreatoorSN.common.showErrorAlert(CreatoorSN.common.translate('Oops an error occured while executing a script. Please try again later') + '.');
				}
			},
			failure: function (o) {
				removeElement(overlay);
                removeElement('smileys' + editor.name);
                CreatoorSN.common.showErrorAlert(o.statusText);
			},
			timeout: CreatoorSN.common.iAjaxTimeout
		};
		YAHOO.util.Connect.asyncRequest(
            "GET",
            "/default/ajax/get-smileys/",
            gsCallback
        );
	},
	
	insertSmiley: function (params) {
		params.editor.insertHtml('<img src="' + params.smiley + '" alt="smiley" />');
		removeElement(_$('smileys' + params.editor.name));
		params.editor.smileysOpened = false;
	},
	/**
     * insert media into active editor instance
     * 
     * @param {Object} params - returned by CreatoorSN.mediaLibrary.
     */
	insertMedia: function (params, progress, swfu, id) {
		params.editor = CreatoorSN.ckeditor.editors[id];
		var mediaConfig = CreatoorSN.mediaLibrary.combo.getConfig(id);
        params.userDirectory = mediaConfig.userDirectory;
        if (swfu) {
            if (swfu.processed) {
                swfu.processed--;
            }
            var status = params.fileName + ': ' + CreatoorSN.common.translate('processing completed');
            if (typeof(swfu.processed) != 'undefined' && !swfu.processed) {
                status = CreatoorSN.common.translate('Processing of all files completed');
               CreatoorSN.mediaLibrary.swfu.removeOverlays(swfu);
               swfu.progressObj.setStatus(status);
               setTimeout("CreatoorSN.mediaLibrary.swfu.clearStatus('" + swfu.customSettings.progress.text + "')", 2000);
            } else {
                swfu.progressObj.setStatus(status);
            }
        }
        switch (params.mediaType) {
			case 'photos':
			    CreatoorSN.ckeditor.insertPhoto(params);
		    break;
			case 'videos':
			    CreatoorSN.ckeditor.insertVideo(params);
			break;
			case 'audio':
			    CreatoorSN.ckeditor.insertAudio(params);
			break;
		}
	},
	
	insertPhoto: function (params) {
		var ipCallback = {
			success: function (o) {
				params.editor.insertHtml(o.responseText);
			},
			failure: function (o) {
				CreatoorSN.common.showErrorAlert(CreatoorSN.common.translate('Oops an error occured while executing a script. Please try again later') + '.');
			},
			timeout: CreatoorSN.common.iAjaxTimeout
		};
		var imgSize = params.editor.mediaConfig && params.editor.mediaConfig.imageSize ? params.editor.mediaConfig.imageSize : CreatoorSN.ckeditor.imageSize;
		YAHOO.util.Connect.asyncRequest(
            "GET",
            "/default/ajax/generate-image/?userDirectory=" + params.userDirectory + "&fileName=" + encodeURIComponent(params.fileName) + "&size=" + imgSize + "&cssClass=center",
            ipCallback
        );
	},
	
	insertVideo: function (params) {
        
        var playerId = 'player' + params.identifier;
		var width = params.editor.mediaConfig && params.editor.mediaConfig.videoWidth ? params.editor.mediaConfig.videoWidth : CreatoorSN.ckeditor.videoWidth;
		var height= params.editor.mediaConfig && params.editor.mediaConfig.videoHeight ? params.editor.mediaConfig.videoHeight : CreatoorSN.ckeditor.videoHeight;
		if (params.width && params.height) {
			height = Math.round(width * params.height / params.width);
		}
        var videoHTML = '<img src="/members_data/' + params.userDirectory + '/videos/' + params.thumbnail + '" '
                      + 'width="' + width + '" height="' + height + '" class="embed-user-video" id="' + playerId + '" '
                      + 'title="/members_data/' + params.userDirectory + '/videos/' + params.fileName + '" alt="flash-video" />';
		params.editor.insertHtml(videoHTML);
	},
	
	insertAudio: function (params) {
		
	},
	
	linkDialog: function (editor, posObj) {
		
		var plugin = CKEDITOR.plugins.link;
		var selection = editor.getSelection();
		var element = null;
		var type = selection.getType();
		var anchorSelect = null;
		if (type == CKEDITOR.SELECTION_NONE) {
			return;
		}
		
		var linkHref = 'http://';
        var linkText = '';
		element = plugin.getSelectedLink(editor);
		if (element) {
			if (element.hasAttribute('href')) {
				linkHref = element.$.href;
				linkText = element.$.text ? element.$.text : element.$.innerHTML;
				selection.selectElement(element);
			}
		} else {
			element = selection.getSelectedElement();
			if (element) {
				selection.selectElement(element);
				if (element.getAttribute( '_cke_real_element_type' ) && element.getAttribute( '_cke_real_element_type' ) == 'anchor' ) {
					return;
				}
				if (element.$.tagName == 'IMG') {
					linkText = '<img src="' + element.$.src + '" alt="' + element.$.alt + '" width="' + element.$.width + '" height="' + element.$.height + '" />';
				}				
			} else {
				if (CKEDITOR.env.ie) {
					selection.unlock(true);
					linkText = selection.getNative().createRange().text;
				} else {
					linkText = selection.getNative().toString();
				}
			}
		}		
		if (!linkText) {
			return;
		}
		if (editor.linksOpened) {
			removeElement('links' + editor.name);
			editor.linksOpened = false;
			return;
		}
		if (!_$('links' + editor.name)) {
			
			var title = new creaDomObject({
				tag: 'div',
				style: {
					fontWeight: 'bold',
					fontSize: '1em'
				},
				html: CreatoorSN.common.translate('Add / edit link')
			});
			
			var linkInput = new creaDomInput({
	            type: 'text',
	            name: 'link',
	            id: 'link' + editor.name,
	            className: 'editor-url-input',
	            value: decodeURIComponent(linkHref),
	            style: {
					width: '250px',
                    border: '1px solid #D3D3D3',
                    marginTop: '5px',
					padding: '2px'
				},
	            label: {tag: 'div', params: {html: 'url:', style:{marginTop: '10px'}}}
	        });						
			var userLinksSelect = new creaDomSelect({
	            name: 'userLinks',
	            id: 'userLinks' + editor.name,
	            style: {
					width: '255px',
					border: '1px solid #D3D3D3',
					marginTop: '5px'
				},
	            wrapper:{tag: 'div', params:{className: 'form-row'}}
	        });
	        var blankOption = create('option', {text: CreatoorSN.common.translate('choose'), value: 0});
	        userLinksSelect.addOption(blankOption);
			userLinksSelect.domElement.onchange = function () {
	            if (this.options[this.selectedIndex].value != '0') {
	                linkInput.domElement.value = this.options[this.selectedIndex].value;
	                if (anchorSelect) {
	                	anchorSelect.domElement.selectedIndex = 0;
	                }
	            }	            
	        };
			
			var okBtn = new creaDomInput({
	            type: 'submit',
	            value: CreatoorSN.common.translate('insert'),
	            name: 'ok',
				style: {
					backgroundColor: '#9AC038',
					color: '#fff',
					padding: '2px 5px',
					border: '1px solid #888888',
                    cursor: 'pointer'
				}
	        });
	        
	        var cancelBtn = new creaDomInput({
	            type: 'button',
	            value: CreatoorSN.common.translate('cancel'),
	            name: 'cancel',
	            style: {
	                marginLeft: '5px',
					backgroundColor: '#9AC038',
                    color: '#fff',
                    padding: '2px 5px',
                    border: '1px solid #888888',
                    cursor: 'pointer'
	            }
	        });
	        var buttonDiv = new creaDomObject({
	            tag: 'div',
				style: {
					marginTop: '5px',
					textAlign: 'center'
				},
	            elements: [okBtn, cancelBtn]
	        });
	        var notificationDiv = new creaDomObject({
	            tag: 'div',
	            className: 'url-description',
	            html: CreatoorSN.common.translate('ready') + '...',
				style: {
					marginTop: '5px',
					padding: '5px',
					border: '1px solid #D3D3D3'
				}          
	        });
	        
	        var elements = [title, linkInput, userLinksSelect, buttonDiv, notificationDiv];
	        
	        var _anchors = editor.document.getElementsByTag('img');
	        if (_anchors.$.length) {
	        	var anchors = [];
	        	var _name = '';
	        	var nameArr;
	        	var element = false;
	        	for (var i = 0; i < _anchors.$.length; i++) {
	        		if (_anchors.$[i].getAttribute('_cke_real_element_type') && _anchors.$[i].getAttribute('_cke_real_element_type') == 'anchor') {
	        			element = decodeURIComponent(_anchors.$[i].getAttribute( '_cke_realelement' ));
	        			if (CKEDITOR.env.ie) {
	        				_name = element.match(/name=[a-zA-Zčšžćđ_]{1}[a-zA-Z0-9_-čšžćđ]*/i);
	        				if (_name) {
	        					nameArr = _name[0].split('=');
	        				}
	        			} else {
	        				_name = element.match(/name="[a-zA-Zčšžćđ_]{1}[a-zA-Z0-9_-čšžćđ]*"/i);
	        				if (_name[0]) {
	        					nameArr = _name[0].split('"');
	        				}
	        			}
	        			if (nameArr && nameArr[1]) {	        				
	        				if (nameArr[1]) {
	        					anchors.push(nameArr[1]);
	        				}
	        			}
	        		}
	        	}
	        	if (anchors.length) {
	        		anchors.sort();
	        		anchorSelect = new creaDomSelect({
	        			name: 'userAnchors',
	    	            id: 'userAnchors' + editor.name,
	    	            style: {
	    					width: '255px',
	    					border: '1px solid #D3D3D3',
	    					marginTop: '5px'
	    				},
	    	            wrapper:{tag: 'div', params:{className: 'form-row'}}
	        		});
	        		var firstOption = create('option', {text: CreatoorSN.common.translate('Choose anchor'), value: 0});
	        		anchorSelect.addOption(firstOption);
	        		for (var i = 0; i < anchors.length; i++) {
	        			var option = create('option', {text: anchors[i], value: '#' + anchors[i]});
	        			if (linkInput.domElement.value.indexOf('#' + anchors[i]) > 0) {
	        				option.selected = true;
	        				linkInput.domElement.value = '#' + anchors[i];
	        			}
	        			anchorSelect.addOption(option);
	        			
	        		}
	        		anchorSelect.domElement.onchange = function () {
	        			if (this.options[this.selectedIndex].value) {
	        				linkInput.domElement.value = this.options[this.selectedIndex].value;
	        				userLinksSelect.domElement.selectedIndex = 0;
	        			}
	        		};
	        		elements = [title, linkInput, userLinksSelect, anchorSelect, buttonDiv, notificationDiv];
	        	}
	        	
	        }
	       
	        var linkForm = new creaDomForm({
	            name: 'linkForm' + editor.name,
	            elements: elements
	        });
	        zIndex++;
	        
	        var _height = CKEDITOR.env.ie ? CreatoorSN.ckeditor.editors[editor.name].editorContainer.offsetHeight  : CreatoorSN.ckeditor.editors[editor.name].editorContainer.clientHeight;
	        var _position = absolutePosition(posObj);
			var _cPosition = absolutePosition(CreatoorSN.ckeditor.editors[editor.name].editorContainer);
			var marginTop = '-' + parseInt(_height - (posObj.clientHeight + (_position.y - _cPosition.y))); 
	        var marginLeft = _position.x - _cPosition.x;
			var linksContainer = new creaDomObject({
				tag: 'div',
				id: 'links' + editor.name,
				className: 'ck-links-container',
				style: {
					marginTop: marginTop + 'px',
					marginLeft: marginLeft + 'px',
					zIndex: zIndex,
					position: 'absolute',
					display: 'block',
					backgroundColor: '#fff',
					width: '260px',
					padding: '5px',
					border: '2px solid #D3D3D3'
				},
				elements: [linkForm]
			});
			
			linksContainer.domElement.onclick = function () {
				zIndex++;
				this.style.zIndex = zIndex;
			};
			linkForm.on('submit', function(form){
	            CreatoorSN.ckeditor.checkLinkUrl(editor, linkText, linkHref, form, linksContainer, notificationDiv);
				return false;
	        });
	        cancelBtn.domElement.onclick = function () {
				linkInput.domElement.blur();
	            removeElement(linksContainer);
				editor.focus();
	        };
	        addAfter(linksContainer,CreatoorSN.ckeditor.editors[editor.name].editorContainer);
			
			CreatoorSN.ckeditor.getUserLinks(userLinksSelect, linksContainer, editor, linkInput);
		}
		
		
	},
	
	getUserLinks: function (linkSelect, container, editor, linkInput) {
		if (CreatoorSN.ckeditor.userLinks) {
			for (x in CreatoorSN.ckeditor.userLinks) {
				var option = create('option', {text: x, value: 0, style:{fontWeight: 'bold', color: '#9E9E9E'}, params:{disabled: true}});
				linkSelect.addOption(option);
				var links = CreatoorSN.ckeditor.userLinks[x];
				for (var i = 0; i < links.length; i++) {
					var tmp = create('option', {text: '-- ' + links[i].text, value: links[i].link});
					if (linkInput.domElement.value == links[i].link) {
						tmp.selected = true;
					}
					linkSelect.addOption(tmp);
				}
			}
			linkInput.domElement.focus();
			linkInput.domElement.select();
			editor.linksOpened = true;
			
		} else {
			var overlay = disableElement(container);
			var glCallback = {
				success: function (o) {
					removeElement(overlay);
					if (YAHOO.lang.JSON.isSafe(o.responseText)) {
						var response = YAHOO.lang.JSON.parse(o.responseText);
						if (response.success) {
							CreatoorSN.ckeditor.userLinks = response.links;
							CreatoorSN.ckeditor.getUserLinks(linkSelect, container, editor, linkInput);
						} else if (response.noAuth) {							
							var login = new noAuth(function (noAuthObj){
                            CreatoorSN.ckeditor.getUserLinks(linkSelect, container, editor, linkInput);
                         }, response.message, function (noAuthObj){
						 	editor.focus();
							removeElement(container);
                            editor.linksOpened = false;							
							noAuthObj.window.close();
						 });
						 
						} else {
							editor.focus();
							removeElement(container);
                            editor.linksOpened = false;
                            CreatoorSN.common.showErrorAlert(response.message);
						}
					} else {
						editor.focus();
						removeElement(container);
                        editor.linksOpened = false;
                        CreatoorSN.common.showErrorAlert(CreatoorSN.common.translate('Oops an error occured while executing a script. Please try again later') + '.');
					}
				},
				failure: function (o) {
					editor.focus();
					removeElement(overlay);
					removeElement(container);
					editor.linksOpened = false;
					CreatoorSN.common.showErrorAlert(o.statusText);
				}
			};
			var request = YAHOO.util.Connect.asyncRequest(
	            "GET",
	            "/members/ajax/get-user-links/",
	            glCallback
	        );
		}
	},
	
	checkLinkUrl: function (editor, linkText, linkHref, form, container, notificationsDiv) {
		values = form.getValues();
		var url = trim(values.link);
		if (url && url != 'http://' && url != linkHref) {
			if (url == values.userLinks) {
				CreatoorSN.ckeditor.insertLink(editor, linkText, url, container);
				return;
			}
			if (url.indexOf('#') === 0) {
				CreatoorSN.ckeditor.insertLink(editor, linkText, url, container, false);
					return;
				
			}
			var overlay = disableElement(container);
			notificationsDiv.domElement.innerHTML = CreatoorSN.common.translate('preverjam') + '...';
			var oCallback = {                
		        success : function (o) {
					removeElement(overlay);
		            if (YAHOO.lang.JSON.isSafe(o.responseText)) {
		                var response = YAHOO.lang.JSON.parse(o.responseText);
		                if (response.success) {
		                    CreatoorSN.ckeditor.insertLink(editor, linkText, url, container);
		                } else {
		                    if (response.noAuth) {
		                        var login = new noAuth(function (noAuthObj){
		                            CreatoorSN.editor.checkLinkUrl(editor, linkText, linkHref, form, container, notificationDiv);
		                        }, response.message);
		                        return;
		                    }
		                    notificationsDiv.domElement.innerHTML = response.message;
		                    
		                }
		            } else {
		                notificationsDiv.domElement.innerHTML = CreatoorSN.common.translate('neznana napaka');		                
		            }           
		        },
		        
		        failure : function (o) {
		            removeElement(overlay);
		            notificationsDiv.domElement.innerHTML = o.statusText;
		        },
		        timeout: CreatoorSN.common.iAjaxTimeout
	        
	        };
	        YAHOO.util.Connect.asyncRequest(
	            "GET",
	            "/members/ajax/check-editor-link-url/?url=" + encodeURIComponent(url),
	            oCallback
	        );
		} else {
			editor.focus();
			removeElement(container);
			editor.linksOpened = false;
		}		
        
        
	},
	
	insertLink: function (editor, linkText, linkHref, container, ext) {
		ext = typeof(ext) == 'undefined' ? true : ext;
		editor.insertHtml('<a href="' + linkHref + '" ' + (ext ? 'rel="external"' : '') + '>' + linkText + '</a>');
		editor.linksOpened = false;
		removeElement(container);
	},
	
	anchorDialog: function (editor, posObj) {
		if (_$('anchors' + editor.name)) {
			removeElement('anchors' + editor.name);
			return;
		}
		var anchorInput;
		var editMode = false;
		var fakeObj = false;
		var editObj = false;
		var loadElements = function( editor, selection, element )
		{
			
			editMode = true;
			editObj = element;
			var attributeValue = editObj.getAttribute( 'name' );
			if ( attributeValue ) {				
				anchorInput.domElement.value = attributeValue;
			} else {
				anchorInput.domElement.value = '';
			}
		};
		
		
		anchorInput = new creaDomInput({
			type: 'text',
			style: {
				width: '250px',
                border: '1px solid #D3D3D3',
                marginTop: '5px',
				padding: '2px'
			},
			label: {tag: 'div', params: {html: CreatoorSN.common.translate('Anchor name:')}}
		});
		
		var insertButton = new creaDomInput({
			type: 'submit',
			style: CreatoorSN.ckeditor.buttonStyle,
			value: CreatoorSN.common.translate('Insert')
		});
		
		var closeButton = new creaDomInput({
			type: 'button',
			style: CreatoorSN.ckeditor.buttonStyle,
			value: CreatoorSN.common.translate('Close')
		});
		closeButton.domElement.style.marginLeft = '5px';
		
		var buttonDiv = new creaDomObject({
			tag: 'div',
			style: {marginTop: '10px', textAlign: 'center'},
			elements: [insertButton, closeButton]
		});
		var anchorForm = new creaDomForm({
			name: 'anchorForm',
			id: 'anchorForm' + editor.name,
			elements: [anchorInput, buttonDiv]
		});
		zIndex++;
		var _height = CKEDITOR.env.ie ? CreatoorSN.ckeditor.editors[editor.name].editorContainer.offsetHeight  : CreatoorSN.ckeditor.editors[editor.name].editorContainer.clientHeight;
		var _position = absolutePosition(posObj);
		var _cPosition = absolutePosition(CreatoorSN.ckeditor.editors[editor.name].editorContainer);
		var marginTop = '-' + parseInt(_height - (posObj.clientHeight + (_position.y - _cPosition.y))); 
        var _position = absolutePosition(posObj);
        var marginLeft = _position.x - _cPosition.x;
		var anchorsContainer = new creaDomObject({
			tag: 'div',
			id: 'anchors' + editor.name,
			style: {
				marginTop: marginTop + 'px',
				marginLeft: marginLeft + 'px',
				zIndex: zIndex,
				position: 'absolute',
				display: 'block',
				backgroundColor: '#fff',
				width: '260px',
				padding: '5px',
				border: '2px solid #D3D3D3'
				
			},
			elements: [anchorForm]
		});
		
		closeButton.domElement.onclick = function () {
			removeElement(anchorsContainer);
		};
		
		var selection = editor.getSelection();
		var element = selection.getSelectedElement();
		if ( element && element.getAttribute( '_cke_real_element_type' ) && element.getAttribute( '_cke_real_element_type' ) == 'anchor' )
		{
			fakeObj = element;
			element = editor.restoreRealElement( fakeObj );
			loadElements(editor, selection, element);
			selection.selectElement( fakeObj );
		} else {
			
		}
		anchorForm.on('submit', function () {
			var anchorName = anchorInput.domElement.value;
			if (!anchorName) {
				return;
			}
			element = CKEDITOR.env.ie ? editor.document.createElement('<a name="' + CKEDITOR.tools.htmlEncode(anchorName) + '>') : editor.document.createElement('a');
			if (editMode) {
				editObj.copyAttributes(element, {name: 1});
				editObj.moveChildren(element);
			}
			element.removeAttribute( '_cke_saved_name' );
			element.setAttribute( 'name', anchorName );
			var fakeElement = editor.createFakeElement( element, 'cke_anchor', 'anchor' );
			if ( !editMode )
				editor.insertElement( fakeElement );
			else
			{
				fakeElement.replace( fakeObj );
				editor.getSelection().selectElement( fakeElement );
			}

			removeElement(anchorsContainer);
			return false;
		});
		
		addAfter(anchorsContainer,CreatoorSN.ckeditor.editors[editor.name].editorContainer);
		anchorsContainer.domElement.onclick = function () {
			zIndex++;
			this.style.zIndex = zIndex;
		};
		anchorInput.domElement.focus();
		anchorInput.domElement.select();
	},
	
	insertDictionaryLink: function (editor) {
		var plugin = CKEDITOR.plugins.link;
		var selection = editor.getSelection();
		var type = selection.getType();
		var element = selection.getSelectedElement();
		if (selection.getSelectedElement() || plugin.getSelectedLink()) {
			return;
		}
		var selectedText = '';
        if (CKEDITOR.env.ie) {
            selection.unlock(true);
            selectedText = selection.getNative().createRange().text;
        } else {
            selectedText = selection.getNative().toString();
        }
		if (selectedText) {
            CreatoorSN.dictionary.fromEditor(selectedText, editor);
        }
	}
	
};
