// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

var asics = new Object();

jQuery.fn.fadeToggle = function(){
    if(this.css("display") == 'none') {
        this.fadeIn()
    } else {
        this.fadeOut()
    }
}

asics.add_close_buttons = function (){
    $(".closure").each(function(i){
        var expendcontent = $(this);
        if (expendcontent.children(".close").size() == 0){
            expendcontent.prepend("<a href='#' class='close'><img src='/img2/inline_close.png'></a>");
            expendcontent.children(".close").click(function(){

		asics.unload_tinymce(expendcontent);

                if (expendcontent.parents("tr").length > 0) {
                    expendcontent.parents("tr").fadeOut();
                } else {
                    expendcontent.fadeOut();
                }
                return false;
            })
        }
    })
}

// Remove any tinyMCE editors so tinyMCE doesn't crash
asics.unload_tinymce = function(element) {
    element.find('span.mceEditor').each(function() {
	tinyMCE.get(this.id.replace(/_parent$/, '')).remove();
    });
}

asics.resize_textareas = function() {
    resize_textarea = function() {
        collapsed = 150
        var lines = $(this).val().split("\n");
        var count = lines.length;

        for (var i=0; i < lines.length; i++) {
            count += parseInt(lines[i].length / 70);
        };

        var rows = parseInt(collapsed / 20);
        if (count > rows) {
            $(this).css({'height': (collapsed * 2) + 'px'})
        }
        if (count <= rows) {
            $(this).css({'height': collapsed + 'px'})
        }
    }
    resized_textareas = $("textarea:not(.no_resize)")
    resized_textareas.keypress(resize_textarea)
    resized_textareas.bind('focus', resize_textarea)
    resized_textareas.bind('beforepaste', resize_textarea)
}

asics.load_optional_js = function() {
    
}

asics.add_ratings = function() {
    $(function(){ 
        r = $('input[@type=radio].star-rating')
        if (r.length > 0) {
            $.rating.groups = {}
            r.rating({required: true})
        } 
    })
    
    $(function(){ 
        r = $('input[@type=radio].star-rating-split4')
        if (r.length > 0) {
            r.rating({required: true, split: 4})
        }
    })
}

asics.add_fancy_iframes = function() {
    f = $('.fancy_popup')
    if (f.length > 0) {
        if( f.hasClass('login_popup')) {
            f.fancybox({
                zoomSpeedIn:	0, 
                zoomSpeedOut:	0, 
                overlayShow: false, 
                frameHeight: 280,
                frameWidth: 500
            })
            
        } else {
            f.fancybox({
                zoomSpeedIn:	0, 
                zoomSpeedOut:	0, 
                overlayShow: true
            })
            
        }
    }
}


asics.fancy_iframes_fix = function() {
    if (!$.fn.fancybox) {
        return
    }
    $.fn.fancybox.showIframe = function() {
		$("#fancy_loading").hide();
		$("form", $($("#fancy_frame").contents())).attr({target: '_top'});
		$("#fancy_frame").show();
	};
	
}
///products/378/show_variation?variation_id=1121&image_index=1
asics.products = {
    variationUrl: "",
    variationRotationUrl: "",
    loadVariation: function(variationId, imageId) {
      var url = this.variationUrl;
      var viewerUrl = this.variationRotationUrl;
      
      var suffix = "variation_id="+variationId+"&image_index="+imageId;
      var viewerSuffix = "variation_id="+variationId+"&image_index="+imageId;

      if(url.indexOf('?') != -1) {
        url += "&" + suffix;
        viewerUrl += "&" + viewerSuffix;
      } else {
        url += "?" + suffix;
        viewerUrl += "?" + viewerSuffix;
      }
      
      $("#product_info").load(url);
      $("#product_rotation_viewer").load(viewerUrl);
      
      document.location.replace("#"+suffix);
      return false;
    },
    maybeLoadVariation: function() {
	var params = asics.extractAnchorParams();
	if (params != null && params["variation_id"] != null && params["image_index"] != null) {
	    this.loadVariation(params["variation_id"], params["image_index"]);
	}
    }
}

asics.extractAnchorParams = function() {
    // Load data from document fragment/params
    var data = document.location.hash.substring(1); // skip leading '#'
    if (data.length > 0) {
	var params = [];
	data = data.split("&");
	for(index in data) {
	    var split = data[index].split("=");
	    var key = split[0];
	    var val = split[1];
	    if (val.length > 0) {
		params[key] = val;
	    }
	}
	return params;
    } else {
	return null;
    }
}

asics.shoe_advisor_onchange = function(url, all) {
    var list = $('#result-item');
    list.addClass('pending');
    
    var url = url+"?"+$('#shoe-advisor-form').serialize();
    if (all) url += "&all=true";

    $.getJSON(url, null, function(json) {
	var size = json["count"];
	var html = json["html"];
	list.html(html);

	list.removeClass('pending');
	$("#search-results #intro").css("display", "none");
	if (size == 0) {
	    $("#results-text").css("display", "none");
	} else {
	    var text = $("#results-text");
	    text.html(json["header"]);
	    text.css("display", "block");
	}
	if (size > json["max"]) {
	    $("#results-more").css("display", "block");
	} else {
	    $("#results-more").css("display", "none");
	}
	
	$('#shoe-count').html(size.toString());
	$('#results-more-count').html(size.toString());
    });
}

// Extract parameters from options and url fragment and reset form
asics.shoe_advisor_load = function(url, options) {
    var changed = false;

    var setParams = function(params) {
	// set use first
	var use;
	if (options.use != null) {
	    use = options.use
	    $("select[name=use]").val(use).change();	
	    delete options.use;
	}

	// then competition category
	var category;
	if (options.competition_category != null) {
	    category = options.competition_category;
	    $("select[name=competition_category]").val(category).change();	
	    delete options.competition_category;
	}

	// Check passed in options
	for(key in options) {
	    $("select[name="+key+"]").val(options[key]).change();
	    changed = true;
	}
    };
    setParams(options);

    // Check fragment
    anchorParams = asics.extractAnchorParams()
    if (anchorParams != null) setParams(anchorParams);

    // Load shoes if necessary
    if (changed) {
	asics.shoe_advisor_onchange(url);
    }
}

asics.shoe_advisor_onclick = function() {
    document.location = '#' + $('#shoe-advisor-form').serialize();
}

asics.shoe_advisor_labels = {}

asics.shoe_advisor_replace_selects = function(url, loadShoes) {
    $("#shoe-advisor-form select").each(function() {
	var select = $(this);
	var selectName = select.attr("name");
	var id = select.attr("name");

	var h = '<span id="'+id+'" class="selectbox';

	// Disable weight if necessary
	if (selectName == "weight") {
	    var gender = $("select[name=gender]");
	    if (gender[0] != null && gender[0].value == "") h += " disabled";
	}

	h += '">';

	var selectedLabel = $($("select[name="+selectName+"] option[selected]")[0]).text();
	if (selectedLabel == "") selectedLabel = asics.shoe_advisor_labels[selectName];
	

	h += '<span class="selected">'+selectedLabel+'</span>';
	h += '<span class="option-group '+asics.shoe_advisor_option_group_class(selectName)+'">';
	select.find("option").each(function() {
	    var opt = $(this);

	    var label;
	    if ((opt.text() == "") && (asics.shoe_advisor_labels[selectName] != null)) {
		label = asics.shoe_advisor_labels[selectName];
	    } else {
		label = opt.text();
	    }
	    h += '<span class="'+asics.shoe_advisor_select_class(selectName, opt.attr("value"))+'"><a href="#" rel="'+opt.attr("value")+":"+selectName+'">'+label+"</a></span>";
	});
	
	h += '</span></span>';
	select.after(h);
	select.hide();
    });

    // set onclick for selected option
    $("#shoe-advisor-form .selectbox").click(function() {
	var box = $(this);
	if (!box.hasClass("disabled"))  {
	    if (!box.hasClass("focus")) {
		box.addClass("focus");
		box.parents("body").append('<a href="#" id="shoe-select-shadow">&nbsp;</a>');
		$("#shoe-select-shadow").click(function() {
		    box.click();
		    return false;
		});
	    } else {
		box.removeClass("focus");
		$("#shoe-select-shadow").remove();
	    }
	}
	return false;
    });

    // set onchange for selects
    $("#shoe-advisor-form select").change(function() {
	var label = $(this).find("option[selected]").text();
	if (label == "") label = asics.shoe_advisor_labels[this.name];
	$("#"+this.name + " .selected").text(label);
    });

    // set onchange for gender
    //if (select_name == "gender") asics.shoe_advisor_select_gender(value);
    $("#shoe-advisor-form select[name=gender]").change(function() {
	asics.shoe_advisor_select_gender(this.value);
    });
    

    // Set onclick for options
    $("#shoe-advisor-form .selectbox span:not(.selected) > a").click(function() {
	var parent = $(this).parents(".selectbox");
	var selected = parent.find(".selected");

	var rel = $(this).attr("rel").split(":");
	var val = rel[0];
	var name = rel[1];

	$("select[name="+name+"]").val(val).change();
	parent.click();

	if (loadShoes) asics.shoe_advisor_onchange(url);

	return false;
    });
}

asics.shoe_advisor_option_group_class = function(field) {
    var cssClass = "";
    if (field == "weight") {
	cssClass = $("select[name=gender]").val().toLowerCase();
    }
    return cssClass;
}

asics.shoe_advisor_select_class = function(field, value) {
    var cssClass = "";
    if (field == "weight") {
	if (value == "") {
	    cssClass = "blank";
	} else {
	    cssClass = value.split("_")[0];
	}
    }
    return cssClass;
}

asics.shoe_advisor_select_gender = function(value) {
    var del, add, text;
    if (value == "Men") {
	del = "women";
	add = "men";
	text = asics.shoe_advisor_label_weight_gender;
	$("#weight").removeClass("disabled");
    } else if (value == "Women") {
	add = "women";
	del = "men";
	text = asics.shoe_advisor_label_weight_gender;
	$("#weight").removeClass("disabled");
    } else {
	del = "men women";
	add = "";
	text = asics.shoe_advisor_label_weight_no_gender;
	$("#weight").addClass("disabled");
    }

    $("#weight .option-group").addClass(add).removeClass(del);
    $("#weight .blank a").text(text);
    $("select[name=weight] option[value='']").text(text);
    $("select[name=weight]").val("").change();
}

asics.productCatalogFilter = function(params) {
    this.set = function(key, val) {
	$("#filter-"+key+" li.selected").removeClass("selected");
	$("#filter-"+key+" li#filter-"+key+"-"+val).addClass("selected");
	this.fields[key] = val;
    };

    this.apply = function(key, value) {
	this.set(key, value);
	this.updateLocation();
	this.loadProducts();
    }

    this.loadProducts = function() {
	var params = this.fieldsAsParams();
	var pathname = document.location.pathname;
	$("#product-catalog").addClass("pending");
	var uri = pathname + ".js";
	if (params.length > 0) uri += "?" + params;
	$.getJSON(uri, null, function(json) {
	    $("#product-catalog").removeClass("pending").html(json["catalog"]);
	    $("#catalog-header").html(json["header"]);
	});
    }

    this.updateLocation = function() {
	var params = this.fieldsAsParams();
	document.location = '#' + params;
    }

    this.fieldsAsParams = function() {
	var hash = [];
	for(index in this.fields) {
	    var val = this.fields[index];
	    //if (val != "all") {
		hash.push(index + "=" + this.fields[index]);
	    //}
	}
	return hash.join("&");
    }

    this.clear = function() {
	var kind = this.fields["kind"];
	if (kind != null) {
	    this.fields = {"kind": kind};
	} else {
	    this.fields = {};
	}
	var filter = this;
	$("ul.item").each(function() {
	    var field = this.id.replace(/filter-/, "");
	    if (field != "") {
		filter.set(field, "all");
	    }
	});
	this.updateLocation();
	this.loadProducts();
    }

    this.fields = {};
    
    var filter = this;

    // Add on-click to all filter links
    $("#catalog-filter a:not(.clear_all)").each(function() {
	$(this).click(function() {
	    var id = $(this).parent()[0].id.split("-");
	    var field = id[1];
	    var val = id[2];
	    if (field == null) {
		filter.clear();
	    } else {
		filter.apply(field, val);
	    }
	    return false;
	});
    });

    // load data from params, dont load products as they should already be loaded.
    for(index in params) {
	this.set(index, params[index]);
    }

    // Load data from document fragment/params
    var data = document.location.hash.substring(1);
    if (data.length > 0) {
	data = data.split("&");
	for(index in data) {
	    var split = data[index].split("=");
	    var key = split[0];
	    var val = split[1];
	    if (val.length > 0) {
		this.set(key, val);
		
	    }
	}
	this.loadProducts();
    };
}

asics.newsletter_subscribe = function(form) {
    $.post(form.action, $(form).serializeArray(), function(response) { 
	$('#subscribe-box').html(response);
    });
    
    return false;
}

asics.bind_base64_ajax = function() {
    $("a.base64ajax:not(.boundAjax)").click(function(evt){
        // to encode to solve quote escape problem
        asics.setup_inline_editor($.base64Decode($(this).attr("ref")))
    })
    $("a.base64ajax").addClass("boundAjax");
}

asics.enable_wysiwyg_editor = function() {
    if ($(".mceEditor").length == 0) {
        return;
    }
    if (typeof(tinyMCE) == "undefined") {
        return;
    }
    // // alert("enable_wysiwyg_editor")
    // if (typeof(tinyMCE) == "undefined") {
    //     window.tinyMCEPreInit = {base: '/javascripts/tiny_mce'}
    //     jQuery.ajax({
    //         url: "/javascripts/tiny_mce/tiny_mce_src.js",
    //         async: false,
    //         dataType: "script", 
    //         global: false
    //     });
    // }
    //    asics.wysiwyg_media_library_subcategory = #{category.to_json};

// return
    tinyMCE.init({
        mode  : "textareas",
        // mode  : "none",
        theme : "advanced",
        plugins: "asics_image",
        theme_advanced_buttons1 : "undo,redo,formatselect,removeformat,bold,underline,strikethrough,|,bullist,numlist,|,blockquote,|,sub,sup,|,link,unlink,|,asics_image",
        theme_advanced_buttons2 : "",
        theme_advanced_buttons3 : "",
        skin : "wp_theme",
        theme_advanced_toolbar_location   : "top",
        theme_advanced_toolbar_align      : "left",
        theme_advanced_statusbar_location : "bottom",
        theme_advanced_resizing           : true,
        theme_advanced_blockformats : "p,h2,h3,h4",
        editor_selector   : "mceEditor",
        editor_deselector : "mceNoEditor",
        convert_urls : false,
        auto_resize: true,
        extended_valid_elements : "iframe[src|width|height|name|align|frameborder|scrolling|marginheight|marginwidth]"
        // forced_root_block: false
    });

    /// workaround to solve confliction of TinyMCE and jQuery Form plugin
    /// (see http://www.nabble.com/Problem-With-jquery-form-plugin-and-tinymce-td14788650s27240.html)
    $().bind('form-pre-serialize', function(event, $form, options) { tinyMCE.triggerSave(); });
    
}

asics.ajaxifyForm = function(f, replaceTarget, redirectTarget) {

    if (typeof(tinyMCE) != "undefined") {
        f.bind('form-pre-serialize', function(event, $form, options) { 
            try{
                tinyMCE.triggerSave(); 
            }catch(e){
                console.debug(e);
            }
        });
    }

    if (f.find("input[type=file]").length > 0) {
	asics.configure_file_upload(f[0]);
    }

    var form = f;
    
    f.ajaxForm({
	beforeSubmit: function() {
	    var uuid = form[0].uuid;
	    if (uuid != null) {
		form.find(".submit_busy span").width("0%");
		/* call the progress-updater repeatedly */
		form[0].progressTimer = setInterval(function () {
		    $.getJSON("/progress?X-Progress-ID="+uuid, function(json) {
			asics.updateUploadProgress(form, json)
		    });
		}, 500);
	    }
	},
        success: function(res_text, status) {
	    if (form[0].progressTimer != null) clearInterval(form[0].progressTimer);
            if(replaceTarget) {
                var rt = $(replaceTarget); 
                asics.unload_tinymce(rt); 
                rt.hide();
                rt.html(res_text);
                rt.fadeIn();
                rt.css({"background-color":"#ffff99"});
            } else {
		window.location.href = redirectTarget
            }
        },
        error: function(res1, status) {
	    //if (form[0].progressTimer != null) window.clearInterval(form[0].progressTimer);
	    
	    //console.log('got it');
            //console.log(replaceTarget);
            
            var et = jQuery(replaceTarget);
            et.html(res1.responseText);
            var f = $("form[class!=\"delete-btn\"]", et);
            asics.ajaxifyForm(f, replaceTarget, redirectTarget);
        }
    })
}

asics.setup_inline_editor = function(data){
    eval('var data_object = ' + data);
    
    var in_place_edit = data_object.in_place_edit;
    
    ajaxify_form = function(res, status){
        var et = jQuery(in_place_edit.edit_editor_at);
        et.html(res);
        var f = $("form[class!=\"delete-btn\"]", et);
	
        if (in_place_edit.do_update_url) {
            f.attr({action: in_place_edit.do_update_url});
        }
	
        if (!in_place_edit.without_ajax_form) {
	    asics.ajaxifyForm(f, in_place_edit.replace_to, in_place_edit.redirect_to);
        }
    }

    jQuery.ajax({
        url: in_place_edit.load_editor_url,
        type: in_place_edit.load_method,
        dataType: "html",
        contentType: "application/json",
        processData: false,
        data: data,
        success: function(res, status){
            ajaxify_form(res, status);
        },
        error: function(res, status) {
            if (in_place_edit.merb_env == 'development') {
                asics._show_error_page_in_iframe(res);
            }
        }
        
    })

}

asics.add_busy_indicator = function(){
  $(".inplace_form input[type='submit']").click(function(evt){
    $(this).wrap("<div class='submit_busy clearfix'><span></span></div>")
  })
}

asics.add_expandable_buttons = function() {
    $(".expandable_field > label").click(function(evt){
        $(this).next('div').toggle()
    })
}

asics.delete_message = function() {
    var message = arguments[0];
    if (message == undefined){ message = "Are you sure?";}
    return confirm(message);
};

asics.polish_admin_tables = function() {
    $(".admin .widefat tbody tr:odd").css("background-color", "#EEE")
    $(".admin .widefat .row_count_number").remove()
    $(".admin .widefat").each(function(evt){
        number = 0
        $('tr', $(this)).each(function(evt){
            $("<td class='row_count_number'>" + number + ". </td>").prependTo($(this))
            number = number + 1
        })
        $(".thead td:first", $(this)).html("")
    })
    
}

asics.configure_file_upload = function(form) {
    /* generate random progress-id */
    var uuid = "";
    for (i = 0; i < 32; i++) {
	uuid += Math.floor(Math.random() * 16).toString(16);
    }
    form.uuid = uuid;
    and_or_question = $(form).attr("action").indexOf("?") >= 0 ? "&" : "?"
    $(form).attr("action", $(form).attr("action") + and_or_question + "X-Progress-ID="+uuid);
}

asics.updateUploadProgress = function(form, json) {
    var progress;
    if (json.state == 'starting') {
	progress = 0;
    } else if (json.state == 'uploading') {
	progress = json.received/json.size;
    } else if (json.state == 'done') {
	progress = 1.0;
	clearInterval(form[0].progressTimer);
    }
    form.find(".submit_busy span").width((progress * 100).toString() + "%");
}


///
/// helper methods for media library
///

asics.open_sub_window = function(url) {
	var option = 'menubar=0,location=0,status=1,scrollbars=1,width=500,height=600';
	var sub_window = window.open(url, null, option);
	sub_window.focus();
	return sub_window;
};

asics.bind_media_library_popups = function() {
    $(".media_library_tag_field:not(.boundAjax)").each(function() {
        var the_media_field = $(this);
        var image_preview = $(".image_preview", the_media_field); /// <div>
        var request_path = '/admin/media_library?subcategory=' + the_media_field.attr('title');

        var refresh_image_preview = function(src_url) {
            if (! src_url) return;
            /// set src_url value as hidden parameter
            $(":hidden", the_media_field).val(src_url)
            /// tag name and attrs
            var tag_name = "img";
            var tag_attr = null;
            var m = src_url.match(/\.(\w+)$/);
            var tag = null;
            if (m && m[1] == "swf") {
                tag_attr = { type: "application/x-shockwave-flash",
                             pluginspage: "http://www.adobe.com/go/getflashplayer",
                             allowScriptAccess: "sameDomain" };
                tag = $('<embed/>').attr({'src': src_url, 'title': src_url});
            } else if (m && (m[1] == "flv" || m[1] == "f4v")) {
              tag = $('<div class="flv_media">' + src_url + '</div>')
            } else {
              tag = $('<img/>').attr({'src': src_url, 'title': src_url});
            }

            image_preview.empty();
            if (tag_attr) tag.attr(tag_attr);
            tag.appendTo(image_preview);
        };
        var add_image_close_button = function() {
            /// return if image close button already exist
            if ($(".delete_image", image_preview).length > 0) {
				$(".delete_image", image_preview).click(add_image_close_function);
				return
			};
            /// return if neither <img> nor <embed> exist
            var e = image_preview;
            if ($(".flv_media", e).length == 0 && $("img", e).length == 0 && $("embed", e).length == 0 && $("object", e).length == 0) return;
            /// create image close button
            var image_close_button = $("<img class=\"delete_image\" src=\"/img2/fancy_closebox.png\"/>");
            image_close_button.prependTo(image_preview).click(add_image_close_function);
         };

		var add_image_close_function = function(){
		   image_preview.empty();
           $(":hidden", the_media_field).val('');
           if($(".flv_media").length == 0) {
             $(".flv_media").remove();
           }
           $(this).remove();
		};
        ///
        add_image_close_button();
        $(".open_popup_window", this).click(function() {
            asics.open_sub_window(request_path);
            window._callback_when_selected = function(asset_id, asset_uri) {
                refresh_image_preview(asset_uri);
                add_image_close_button();
            }
        });
    });

    $(".media_library_tag_field").addClass("boundAjax");
}

asics.toggle_rating = function(){
  if($("#own").attr("checked")){
    $("#rating_box").show();
    $("#rate_label").hide();
  }
  else{
    $("#rating_box").hide();
    $("#rate_label").show();
  }
}

$(document).ready(function(){
    
    $("body").ajaxComplete(function(evt, request, settings){
        asics.bind_base64_ajax()
        asics.add_close_buttons()
        asics.add_ratings()
        asics.add_busy_indicator()
        asics.add_fancy_iframes()
        asics.fancy_iframes_fix()
        asics.add_expandable_buttons()
        asics.enable_wysiwyg_editor()
        asics.resize_textareas()
        asics.bind_media_library_popups()
    });
    
    asics.bind_base64_ajax()
    asics.add_ratings()
    asics.add_fancy_iframes()
    asics.fancy_iframes_fix()
    asics.load_optional_js()
    asics.add_busy_indicator()
    asics.add_expandable_buttons()
    asics.resize_textareas()
    asics.bind_media_library_popups()
    $('.delete').click(function() {
        var answer = confirm('Are you sure?');
        return answer;
    }); 
    asics.toggle_rating();
});

