﻿/*
 * @author stuartb
 * @date 2008.10.08
 * @description Wizard forms made easy.
 */
 
jQuery.fn.wizard = function(settings)
{
    settings = jQuery.extend({
         show: function(element) { return true; },
         prevnext: true,
         submitpage: null
      }, settings);

    // Hide all pages save the first.
    jQuery(this).children(".wizardpage").hide();
  
    //tailor-made hack for KenticoCMS4.
    //show final confirmation if there is any server validation errors  
    if ($(".ErrorLabel").length > 0){
	    
	   confirmationpage =  jQuery(this).children(".wizardpage:last");
	   confirmationpage.show();
	   settings.show(confirmationpage);
	    
	   $(".ErrorLabel").hide();

	   servaliditem = confirmationpage.find(".errorField");
	   count = 0;
	    
	   while(count<servaliditem.size()){

		errormessage = jQuery.trim(servaliditem.eq(count).children(".EditingFormErrorLabel").text());

		if (jQuery.trim(errormessage) != ""){			
	    	if (servaliditem.eq(count).is(".securitycode")){
		        servaliditem.eq(count).text("Please enter the security code shown below.");
	        }
			servaliditem.eq(count).removeClass("hide");
            servaliditem.eq(count).parent().addClass("error");
			    	    
		}else{
            servaliditem.eq(count).parent().removeClass("error");
            servaliditem.eq(count).addClass("hide");
		}

		count++;
	    }		    
    
    }else{
	   jQuery(this).children(".wizardpage:first").show();
    	   settings.show(jQuery(this).children(".wizardpage:first"));
    }
    
    // Also highlight the first nav item.
    jQuery(this).children(".wizard-nav").children("a:first").addClass("active");
    
    // Wire progress thingy
    jQuery(this).children(".wizard-nav").children("a").click(function(){
        var target = jQuery(this).attr("href");
        jQuery(this).parent().parent().children(".wizardpage").hide();
        jQuery(target).fadeIn('slow');
        settings.show(jQuery(target));
        jQuery(this).parent().children('a').removeClass('active', 'slow');
        jQuery(this).addClass('active', 'slow');
        return false;
    });
    
    // Prevent form submission on a wizard page...
    jQuery(this).children(".wizardpage").each(function(i){
        // unless there is a submit button on this page
        if((settings.submitpage == null && jQuery(this).find('input[type="submit"]').length < 1) ||
           (settings.submitpage != null && !$(this).is(settings.submitpage)))
        {
            $(this).find('input,select').keypress(function(event){
                return event.keyCode != 13;
            });
        }
    });
    
    if(settings.prevnext)
    {
        // Add prev/next step buttons
        jQuery(this).children(".wizardpage")
        .append('<div class="row wizardcontrols"></div>')
        .children(".wizardcontrols")
            .append('<input type="button" class="wizardprev fg-button ui-state-default fg-button-format ui-corner-all uicolor01" value="< Back" /><input type="button" class="wizardnext fg-button ui-state-default fg-button-format ui-corner-all uicolor01 submit" value="Next >" />');
        jQuery('.wizardpage:first input[type="button"].wizardprev').hide(); // hide prev button on first page
        jQuery('.wizardpage:last input[type="button"].wizardnext').hide();  // hide next button on last page

        // Wire prev/next step buttons
        jQuery(this).children(".wizardpage")
        .children(".wizardcontrols")
        .children('input[type="button"].wizardprev').click(function(){
            var wizardpage = jQuery(this).parent().parent(); // wizardcontrols div, wizardpage div
            var wizardnav  = wizardpage.parent().children(".wizard-nav");
            
             if (wizardpage.hasClass("skipprev")){
                
                wizardpage.fadeOut();
                wizardpage.prev().prev().fadeIn();
	            settings.show(wizardpage.prev().prev());
            
            }else{
            
                wizardpage.hide();
                
                //custom enhancement for conditional form
                $(".wizardsubpage").hide();
                $(".wizardsubpage:eq(" + ($("input:radio[name=substep]:checked").val()-1) + ")").show();
                
                wizardpage.prev().fadeIn();
                settings.show(wizardpage.prev());
                
                try{ wizardpage.prev().find("input:first").focus(); } catch(err) {}
                wizardnav.children('a').removeClass('active', 'slow');
                wizardnav.children('a[href="#' + wizardpage.attr('id') + '"]').prev().addClass('active', 'slow');
            }
        });
        
        jQuery(this).children(".wizardpage")
        .children(".wizardcontrols")
        .children('input[type="button"].wizardnext').click(function(){
            var wizardpage = jQuery(this).parent().parent(); // wizardcontrols div, wizardpage div
            var wizardnav  = wizardpage.parent().children(".wizard-nav");
                       
               var validatepass = true;
                
               if (wizardpage.is(".validate")){
	               validatepass = validation(wizardpage);
	   		    }
    	   	
	           if (!validatepass){   
    	           
	                //currentpage if fail validation
		            wizardpage.fadeIn();
	    	        settings.show(wizardpage);
            	    
	           }else{
    		       
			        wizardpage.hide();
                
	                //customer enhancement
	                $(".wizardsubpage").hide();
	                $(".wizardsubpage:eq(" + ($("input:radio[name=substep]:checked").val()-1) + ")").show();


                if (wizardpage.hasClass("skipnext")){
                
                wizardpage.fadeOut();
                wizardpage.next().next().fadeIn();
	            settings.show(wizardpage.next().next());
            
                }else{
		            //next page if pass validation
	                wizardpage.next().fadeIn();
	                settings.show(wizardpage.next());
	                }
		       }
		   
                try{ wizardpage.prev().find("input:first").focus(); } catch(err) {}
                wizardpage.prev().find("input:first").focus();
                wizardnav.children('a').removeClass('active', 'slow');
                wizardnav.children('a[href="#' + wizardpage.attr('id') + '"]').next().addClass('active', 'slow');  
        });
    }
    
    function validation(object){
	    
	    var vpass = true;
	    
	    if (object.find(".wizardsubpage").size() > 1){
		   object = object.find(".wizardsubpage").eq($("input:radio[name=substep]:checked").val()-1);
		}
		   
	   var itemsize = object.find(".required").size();
           
       while (itemsize > 0){
           
           var item = object.find(".required").eq(itemsize-1);
           
           if (item.val()== ""){
	       		item.parent().siblings(".errorField").fadeIn();
			    item.parent().parent().addClass("error");
	       		item.focus();
	       		vpass = false;
   	   		}else{
     	   		item.parent().siblings(".errorField").fadeOut();
				item.parent().parent().removeClass("error");
       	   	}
   	   		itemsize--;
   	   }
   	   
	try{
   	  var longtextitemsize = object.find(".requiredlongtext").size();
   	   
   	  while(longtextitemsize > 0){
	   	   var longtextitem = object.find(".requiredlongtext").eq(longtextitemsize-1);
		   var instancename_input = longtextitem.children().children().find("textarea[name!='']");
		   ltitemname = instancename_input.attr("name"); 
	   	   var oEditor = FCKeditorAPI.GetInstance(ltitemname);
		   if (oEditor.GetHTML() == ""){
				longtextitem.siblings(".errorField").fadeIn();
				longtextitem.parent().addClass("error");
				oEditor.Focus();
				vpass = false;
		   }else{
				longtextitem.siblings(".errorField").fadeOut();
				longtextitem.parent().removeClass("error");
		   } 	   
	     longtextitemsize--;
	  }
	}
	catch(err)
	{
	}
	
	  var dateitemsize = object.find(".reqdate").size();
   	   
   	  while(dateitemsize > 0){
	   
	   	dateitem = object.find(".reqdate").eq(dateitemsize-1);
	   	dateitemname = dateitem.find(".CalendarTextBox");	   	    
	   	     
			 if (dateitemname.val() == ""){
				dateitem.parent().siblings(".errorField").fadeIn();
				dateitem.parent().parent().addClass("error");
				vpass = false;
			 }else{
				dateitem.parent().siblings(".errorField").fadeOut();
				dateitem.parent().parent().removeClass("error");
			 }   	   
	    	dateitemsize--;
	   }
	   
	   var emailitemsize = object.find(".email").size();
	   
	   while(emailitemsize > 0){
	    emailitem = object.find(".email").eq(emailitemsize-1);
	        if (emailitem.val() != ""){
    	        var pattern = new RegExp("[a-z0-9._%-]+@[a-z0-9.-]+\\.[a-z]{2,4}");
    	        
    	        if(pattern.test(emailitem.val())==false){
    	            emailitem.parent().siblings(".errorField").fadeIn();
			        emailitem.parent().parent().addClass("error");
	       		    emailitem.focus();
	       		    vpass = false;
    	        }else{
    	            emailitem.parent().siblings(".errorField").fadeOut();
				    emailitem.parent().parent().removeClass("error");
    	        }
	        }	        
	        emailitemsize--;
	   }
	   
	   var dateitemsize = object.find(".dateformat").size();
	   
	   while(dateitemsize > 0){
	        dateitem = object.find(".dateformat").eq(dateitemsize-1);
	        if (jQuery.trim(dateitem.children(".CalendarTextBox").val()) != ""){
    	        var pattern = new RegExp("^[0-3]?[0-9]/[0-1]?[0-9]/20[0-9][0-9]");    
    	        if(pattern.test(jQuery.trim(dateitem.children(".CalendarTextBox").val()))==false){
    	            dateitem.parent().siblings(".errorField").fadeIn();
			        dateitem.parent().parent().addClass("error");
	       		    dateitem.focus();
	       		    vpass = false;
    	        }else{
    	            dateitem.parent().siblings(".errorField").fadeOut();
				    dateitem.parent().parent().removeClass("error");
    	        }
	        }	        
	        dateitemsize--;
	    }

	    // added by libo on 1/10/2009 
	    //begin url validation
	    var urlitemsize = object.find(".url").size();

	    while (urlitemsize > 0) {
	        var urlitem = object.find(".url").eq(urlitemsize - 1);
	        if (urlitem.val() != "") {
//	            var pattern = new RegExp("^https?:\/\/[a-z0-9.-/]+\.[a-z/]{2,5}$");
//              if (pattern.test(urlitem.val()) == false) {
	            if (URLvalidation(urlitem.val()) == false) {
	                urlitem.parent().siblings(".errorField").fadeIn();
	                urlitem.parent().parent().addClass("error");
	                urlitem.focus();
	                vpass = false;
	            } else {
	                urlitem.parent().siblings(".errorField").fadeOut();
	                urlitem.parent().parent().removeClass("error");
	            }
	        }
	        urlitemsize--;
	    }
	    //end url validation

	    //Limiting keywords to 10 for free companies.
	    var tagitemsize = object.find(".tag").size();
	    while (tagitemsize > 0) {
	        var tagitem = object.find(".tag").eq(tagitemsize - 1);
	        if ($("span.ispaid input[type=checkbox]").length) {
	            if (!$("span.ispaid input[type=checkbox]").attr('checked')) {
	                var tags = $(".selectedtaglist").val().split(',');
	                if (tags.length > 10) {
	                    tagitem.parent().siblings(".errorField").fadeIn();
	                    tagitem.parent().parent().addClass("error");
	                    tagitem.focus();
	                    vpass = false;
	                }
	                else {
	                    tagitem.parent().siblings(".errorField").fadeOut();
	                    tagitem.parent().parent().removeClass("error");
	                }
	            }
	        }
	        tagitemsize--;
	    }
        
	   //fix error box
	   $(".EditingFormControlNestedControl").removeClass("error");
			       	   
	   return vpass;
}
	
	var URLvalidation = function(value) {
	    return /^(https?):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
	};
	
    return jQuery(this);
};

jQuery.fn.getSuggestedKeyword = function(settings){

    settings = jQuery.extend({
        container : $("#suggestedtaglist"),
        loading : "<img src='/Includes/Penguin/Common/img/ajax-loader.gif' style='text-align:center;' /> Loading ... ",
        filter : true,
        url : "/CMSFormControls/PenguinTaggingSelector/SelectPenguinTagSuggestHandler.ashx", 
        timeout : 3000,
        errormsg : "We were unable to suggest any keywords based on the description you provided. Please manually enter some keywords below."
    }, settings);

    //display loading message
    settings.container.html(settings.loading);

    //filter all escape characters and entity name
    if(settings.filter){
        settings.text = settings.text.replace(/&[a-z0-9#]{2,10};/gi, '');
        settings.text = settings.text.replace(/[#%&]/g, '');
    }
    
    //fire request and display suggested keywords
    $.ajax({
        type: "POST",
        datetype: "html",
        url: settings.url,
        data: "text=" + settings.text + "&tag=" + settings.tag,
        error: function(){settings.container.html(errormsg);},
        timeout : settings.timeout,
        success: function(msg){settings.container.html(msg);}          
	}); 
}
