var YW = YAHOO.widget;

//var YA = YAHOO.util.Anim;
function $(id){
    return YD.get(id);
}
/**namespace for page globals**/
var Page = {}
Page.richEditors = {}
/**
SW is a holder for SmartWeb developed custom scripts
**/
var SW = {
    asyncFormSubmit: function(form, button, config) {
        button.set('disabled', true);
        window.setTimeout(function(){
            button.set('disabled', false);
        }, 20 * 1000);
        
        var clearErrors = function() {
            errors = YD.getElementsByClassName('error', 'span', null, 
                function(el) {
                    el.className = 'error hidden';
                }   
            );
            errors = YD.getElementsByClassName('error-icon', 'span', null, 
                function(el) {
                    el.className = 'error-icon hidden';
                }   
            );
        } 
        var config = YL.merge({
            validationSuccess: null,
            validationError: function(o) {
                button.set('disabled', false);
                eval('result = ' + o.responseText);
                var minTop = 100000;
                for (var key in result) {
                    var error_div = $(key + '_error');
                    if (error_div == null) {
                        alert('No error container defined for: ' + key);
                        continue;
                    }
                    error_div.className = 'error';
                    error_div.innerHTML = result[key];
                    var error_icon_div = $(key + '_error_icon');
                    error_icon_div.className = 'error-icon';
                    var top = YD.getY(error_div);
                    if (top < minTop) {
                        minTop = top;
                    }
                }
                window.scrollTo(0, minTop - 100);
            },
        	validationFailure: function(o) {
                button.set('disabled', false);
                //alert('Error during validation')
                //DO NOTHIND, TODO log somehting in debug
            },
            handler: {
                success: function(o) {
                    clearErrors();
                    if (o.responseText == "OK") {
                        config.validationSuccess(o);
                    } else {
                        config.validationError(o);
                    }
                },
                failure: config.validationFailure
            },
            method: 'POST',
            url: form.action
        }, config == null ? {} : config);
        SW.refreshRichTexts();
        YC.setForm(form);
        YC.asyncRequest(config.method, config.url, config.handler); 
        return false;
    },
    validateSubmit: function(button, formSchema) {
        var htmlButton = button.getForm ? button._button : button;
        var form = htmlButton.form
        if (form.validated) {
            return true
        }
        this.asyncFormSubmit(form, button, {
            url: '/validation/index/' + formSchema, 
            validationSuccess: function(o) {
                form.validated = true;
                button.set('disabled', false);
                htmlButton.click()
                button.set('disabled', true);
            }
        });
        return false;
    },
    submitInline: function(button, validationSuccess) {
        this.asyncFormSubmit(button.getForm(), button, {
            validationSuccess: validationSuccess
        });
        return false;
    },
    /** Common overlay manager used to show only one help menu
    on the page initialize lazily**/
    overlayManager: null,
    
    registerHelpPanel: function (el, config) {
        /** Requires YUI container.js**/
        if (this.overlayManager == null) {
            this.overlayManager = new YW.OverlayManager()
        };
        var o = YL.merge({
                width: '300px',
            	iframe: true,
            	fixedcenter: false,
                close: true
            }, config == null ? {} : config);
        var panel = null;
        YE.on(el, 'click', function (e) {
            SW.overlayManager.hideAll()
            if (panel == null) {
                panel = new YW.Panel(YD.generateId(), {
                    width: o.width,
                	visible: false,
                	hidden: true, 
                	draggable: false,
                	close: o.close,
                	fixedcenter: (o.fixedcenter == 'true'),
                	context: [el, 'tl', 'bl']
                });
                panel.setHeader(o.header);
                panel.setBody(o.body);
                panel.render(document.body)
                SW.overlayManager.register(panel)
            }
            panel.show()
            YE.stopPropagation(e);
        });
        if (config == null || config.close_on_body_click != 'false'){
	        YE.on(document.body, 'click', function(e) {
	            SW.overlayManager.hideAll()
	        });
	    }
    },
    nicEditorButtons: ['fontFormat','bold','italic','underline','strikeThrough','undo', 'redo', 'left','center','right','ol','ul','indent','unindent','hr','link'],
    
    maxLength: function(objId, maxLength, monitorId /*optional*/) {
    	var obj = YD.get(objId); 
    	var isTextarea = (obj.tagName.toLowerCase() == 'textarea');
    	var monitor = YD.get(monitorId);

    	if (!isTextarea) { obj.maxLength = maxLength };

    	var getCharLeft = (isTextarea) ? function() {
    		var lfs = obj.value.match(/\n/g);
    		return maxLength - obj.value.length - (lfs ? lfs.length : 0);
    	} : function() {
    		return maxLength - obj.value.length;
    	} 

    	var updateMonitor = function(num) {
    		monitor.innerHTML = num;
    	};

    	var handler = SW.limitExecByInterval(function(e) {
    		var charLeft = getCharLeft();
    		if (charLeft < 0 && isTextarea) {
    		    var lfs = obj.value.match(/\n/g);
    			obj.value = obj.value.substring(0, maxLength - (lfs ? lfs.length : 0));
    			charLeft = 0;
    		};
    		if (monitor) updateMonitor(charLeft);
    	}, 150);
    	handler();
    	obj.updateMonitor = handler;

    	YE.on(obj, 'change', handler);
    	YE.on(obj, 'keyup', handler);
    },
    
    limitExecByInterval: function(fn, time) {	
    	var lock, execOnUnlock, args;
    	return function() {
    		args = arguments;
    		if (!lock) {				
    			lock = true;
    			var scope = this;
    			setTimeout(function(){
    				lock = false;
    				if (execOnUnlock) {
    					args.callee.apply(scope, args);
    					execOnUnlock = false;
    				}
    			}, time);
    			return fn.apply(this, args);
    		} else execOnUnlock = true;
    	}
    },
	loadScript: function(url, elementId) {
    	var oScript = document.createElement("script");
    	oScript.type = "text/javascript"
    	oScript.src = url;
    	if (elementId != null) {
    		oScript.id = elementId;
    	}
    	document.body.appendChild(oScript);
    },
    richEditorForTextarea: function(nodeId) {
        Page.richEditors[nodeId] = new nicEditor({buttonList : SW.nicEditorButtons}).panelInstance(nodeId);
    },
    refreshRichTexts: function() {
        for (key in Page.richEditors) {
            // alert(Page.richEditors)
            // alert(Page.richEditors[key].nicInstances[0].getContent())
            YD.get(key).value = Page.richEditors[key].nicInstances[0].getContent()
        }
    },
    ButtonCodeViewer: function(codeAreaId){
   		var codeAreaObj = document.getElementById(codeAreaId);
   		var buttonsRegister = new Array();
		this.isRegisteredButton = function(buttonObj){
			for (var i = 0; i < buttonsRegister.length; i ++) {
				if (buttonsRegister[i] == buttonObj) {
					return true;
				}
			}
			return false;
		}
		this.click = function(buttonObj){
			for (var i = 0; i < buttonsRegister.length; i ++) {
		    	buttonsRegister[i].className = buttonObj.defaultClass;
		        buttonsRegister[i].selected = false;
		    }
		    if (!this.isRegisteredButton(buttonObj)) {
		    	buttonsRegister[buttonsRegister.length] = buttonObj;
		    }
		    buttonObj.className = 'promo-button-wrapper-selected';
		    buttonObj.selected = true;
		    codeAreaObj.value = buttonObj.innerHTML;
			return false;
		}
		this.over = function(buttonObj){
			if (buttonObj.defaultClass == null) {
				buttonObj.defaultClass = buttonObj.className;
			}
			buttonObj.className = 'promo-button-wrapper-selected';
		}
		this.out = function(buttonObj){
			if (!buttonObj.selected) {
				buttonObj.className = buttonObj.defaultClass;
			}
		}
	},
	expandCollapseFacetList: function (listContainerId, expandButtonObj, collapsedItemNumber, moreCaption, collapceCaption){
    	if (expandButtonObj.parentNode.isExpanded == null || expandButtonObj.parentNode.isExpanded == false){
        	var groupsContainer = document.getElementById(listContainerId);
        	groupsContainer.style.height = (groupsContainer.offsetHeight - 6) + 'px';
        	expandButtonObj.parentNode.className = 'search-facet-items search-facet-items-expanded';
        	var listItems = expandButtonObj.parentNode.getElementsByTagName('li');
        	for (var i = collapsedItemNumber + 1; i < listItems.length; i ++){
        		if (expandButtonObj != listItems[i]){
	        		listItems[i].className = '';
	        	}
        	}
        	expandButtonObj.style.listStyleImage = 'url(/image/icon/minus.gif)';
        	expandButtonObj.innerHTML = '<span>' + collapceCaption + '</span>';
        	expandButtonObj.parentNode.isExpanded = true;
        } else {
        	expandButtonObj.parentNode.className = 'search-facet-items';
        	var listItems = expandButtonObj.parentNode.getElementsByTagName('li');
        	for (var i = 0; i < listItems.length; i ++){
        		if (i > collapsedItemNumber && i < listItems.length - 1){
	        		listItems[i].className = 'item-collapsed';
	        	}
        	}
        	expandButtonObj.style.listStyleImage = 'url(/image/icon/plus.gif)';
        	expandButtonObj.innerHTML = '<span>' + moreCaption + '</span>';
        	expandButtonObj.parentNode.isExpanded = false;
        }
    },
	expandCategoryList: function (listContainerId, expandButtonObj){
		expandButtonObj.style.display = 'none';
    	var catagoryContainer = document.getElementById(listContainerId);
    	var categoryItems = catagoryContainer.getElementsByTagName("span");
    	for (var i = 0; i < categoryItems.length; i++){
    		categoryItems[i].className = categoryItems[i].className.replace("category-collapsed", "");
    	}
    	return false;
    },
    hideSearchEngineRegisterLabel: function (containerId, domainName){
		document.getElementById(containerId).style.display = 'none';
		YAHOO.util.Cookie.set("show_se_label", "False", { 
		    path: "/",           
		    domain: domainName,
		    expires: new Date(new Date().getTime() + 1000 * 3600 * 24 * 356 * 10)
		}); 
    },
    expnadCollapseNode: function (nodeId){
    	var node = document.getElementById(nodeId);
    	if (node.style.display == 'block'){
    		node.style.display = 'none';
    	} else {
    		node.style.display = 'block';
    	}
    },
    ColorSchemaToggle: function (){
    	var containerRegister = new Array();
    	this.isRegisteredContainer = function(containerObj){
			for (var i = 0; i < containerRegister.length; i ++) {
				if (containerRegister[i] == containerObj) {
					return true;
				}
			}
			return false;
		}
    	this.click = function(containerNodeId){
	    	var containerNode = document.getElementById(containerNodeId);
	    	for (var i = 0; i < containerRegister.length; i ++) {
				containerRegister[i].className = "color-schema-wrapper";
			}
	    	containerNode.className = containerNode.className + " color-schema-wrapper-active";
	    	if (!this.isRegisteredContainer(containerNode)){
	    		containerRegister[containerRegister.length] = containerNode;
	    	}
	    }
    }
}


