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)
		}); 
    },
    hideImportantMessage: function (containerId, domainName){
		document.getElementById(containerId).style.display = 'none';
		YAHOO.util.Cookie.set("show_important_message", "False", { 
		    path: "/",           
		    domain: domainName,
		    expires: new Date(new Date().getTime() + 1000 * 3600 * 24)
		}); 
    },
    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;
	    	}
	    }
    },
    toglePromoBlock: function(domainName) {
      function setCookie(value, domainName) {
          YAHOO.util.Cookie.set("show_promo_block", value, { 
            path: "/",           
            domain: domainName,
            expires: new Date(new Date().getTime() + 1000 * 3600 * 24 * 356 * 10)
        });
      }
      var promoContainer = YD.get('promo-header-container');
      var collapsedRegisterBlockContainer = YD.get('collapsed-promo-block-register-container');
      if (promoContainer.collapsed) {
          promoContainer.collapsed = false;
          promoContainer.className = 'promo-header-expanded-wrapper';
          if (collapsedRegisterBlockContainer){
              collapsedRegisterBlockContainer.innerHTML = '';
          }
          YD.get('close_label_div').onmouseover = function() {  };
          YD.get('close_label_div').onmouseout = function() {  };
          YD.get('close_label_div').style.backgroundColor = 'transparent';
          setCookie("True", domainName);
      } else {
          promoContainer.collapsed = true;
          promoContainer.className = 'promo-header-collapsed-wrapper';
          if (collapsedRegisterBlockContainer){
              collapsedRegisterBlockContainer.innerHTML = YD.get('register-button-container').innerHTML;
          }
          YD.get('close_label_div').onmouseover = function() { SW.anim.animate(); };
          YD.get('close_label_div').onmouseout = function() { SW.anim_out.animate(); };
          setCookie("False", domainName);
      }
  }
}

function incr_element_value(element, value) {
	element = document.getElementById(element);
	element.innerHTML = Number(element.innerHTML) + value;
}

function update_funtionality_price(check_box_element, price_show_element, comulative_price_element, price) {
    YAHOO.util.Event.on(check_box_element, "change", function(e) {
        if (e.target.checked) {
            YAHOO.util.Dom.get(price_show_element).innerHTML = price;
            incr_element_value(comulative_price_element, price);
        } else {
            YAHOO.util.Dom.get(price_show_element).innerHTML = 0;
            incr_element_value(comulative_price_element, -1*price);
        }
    });
}

var FormTemplate = {
    create: function(form_name, menu_container_id, menu_toggle_id) {
        var oMenu = new YAHOO.widget.Menu(menu_container_id + "_basicmenu");
        var transaction = YAHOO.util.Connect.asyncRequest(
            "POST", 
            "/user_settings/list_form_templates", 
            { 
                success: function(o) {
                    if (o.status == 200) {
                        document.getElementById(menu_container_id).innerHTML = "";
                        var response;
                        eval("response = " + o.responseText);
                        response = response.response;
                        var items = [];
                        for (i in response) {
                            var template_name = response[i];
                            items.push({
                                text: template_name, 
                                onclick: {
                                    fn: (function (template_name) {
                                        return function () {
                                            FormTemplate.load("" + form_name, "" + template_name);
                                        }
                                    })(template_name)
                                }
                            });
                        }
                        oMenu.addItems([
                            [
                                {
                                    text: "Сохранить текущую форму", 
                                    onclick: { fn: function () {
                                        FormTemplate.save(form_name, menu_container_id, menu_toggle_id);
                                    } }
                                },
                                {
                                    text: "Редактировать сохраненные", 
                                    url: "/user_settings/manage_form_templates?_form_name=" + encodeURIComponent(form_name)
                                }
                            ],
                            items,
                        ]);
                        oMenu.setItemGroupTitle("Общие опции", 0);
                        oMenu.setItemGroupTitle("Сохраненные шаблоны", 1);
                        oMenu.render(menu_container_id);
                        YAHOO.util.Event.addListener(menu_toggle_id, "click", oMenu.show, null, oMenu);        
                    } else {
                    }
                }, 
                failure: function(o) {
                }, 
                argument: null 
            }, 
            "_form_name=" + encodeURIComponent(form_name)
        );
    },
    save: function (form_name, menu_container_id, menu_toggle_id) {
        template_name = prompt("Enter template name");
        if (template_name) {
            YAHOO.util.Connect.setForm(document.forms[form_name]);
            var transaction = YAHOO.util.Connect.asyncRequest(
                "POST", 
                "/user_settings/save_form_template", 
                { 
                    success: function(o) {
                        if (o.status == 200) {
                            alert("Ok");
                            //FormTemplate.create(form_name, menu_container_id, menu_toggle_id);
                        } else {
                            alert("Error");
                        }
                    }, 
                    failure: function(o) {
                    }, 
                    argument: null 
                }, 
                "_form_name=" + encodeURIComponent(form_name) + "&_template_name=" + encodeURIComponent(template_name)
            );
        }
    },
    load: function (form_name, template_name) {
        if (template_name) {
            var transaction = YAHOO.util.Connect.asyncRequest(
                "POST", 
                "/user_settings/get_form_template", 
                { 
                    success: function(o) {
                        if (o.status == 200) {
                            var response;
                            eval("response = " + o.responseText);
                            response = response.response;
                            var s = [];
                            for (i in response) {
                                s.push(i + "=" + response[i]);
                                FormTemplate.set_element_value(form_name, i, response[i]);
                            }
                            //alert(s.join(", "));
                            alert("Loaded");
                        } else {
                            alert("Error");
                        }
                    }, 
                    failure: function(o) {
                    }, 
                    argument: null 
                }, 
                "_form_name=" + encodeURIComponent(form_name) + "&_template_name=" + encodeURIComponent(template_name)
            );
        }
    },
    set_element_value: function (form_name, element_name, value) {
        element = document.forms[form_name][element_name];
        /*
        if (element_name == "period") {
            var s = [];
            for (i in element) {
                s.push(i + "=" + element[i].type);
            }
            alert(s.join(", "));
        }
        */
        //element = document.getElementById(element_id);
        if (element) {
            if (is_type_checkbox(element) && asbool(value) && !element.checked) {
                element.checked = true;
                if (element.onchange) {
                    element.onchange();
                }
            } else if (is_type_radio_group(element)) {
                for (i in element) {
                    radio = element[i];
                    if (radio.value == value && !radio.checked) {
                        radio.checked = true;
                        if (radio.onchange) {
                            radio.onchange();
                        }
                        break;
                    }
                }
            } else if (is_type_text(element)) {
                element.value = value;
                if (element.onchange) {
                    element.onchange();
                }
            } else if (is_type_select_one(element)) {
                var s = [];
                for (i in element.options) {
                    if (element.options[i].value == value) {
                        element.options[i].selected = true;
                        if (element.options[i].onchange) {
                            element.options[i].onchange();
                        }
                        break;
                    }
                    s.push(i + "=" + element.options[i].value);
                }
                //alert("VALUE=" + value + " | " + s.join(", "));
            }
        }
    }
};
