Codebase.load("http://codebase.gd-ks.com/js/Object.js");
Codebase.load("http://codebase.gd-ks.com/js/Event.js");
Codebase.load("http://codebase.gd-ks.com/js/Style.js");
Codebase.load("http://codebase.gd-ks.com/js/Element.js");

/* Cool feature would be to link Dialogs and be returned values

var DialogGetBucketNoteType=function getBucketNoteType()
                            {
                               Dialog.show({"title": "<strong>Empty Bucket</strong>", 
                                            "text": "Please select a method of contact from the drop-down below: ", 
                                            "input": Dialog.INPUT_DROPDOWN, 
                                            "options": [["Postcard", "Postcard"], ["Letter", "Letter"], ["Email", "Email"], ["Phone Call", "Phone Call"]], 
                                            "buttons": ["Cancel", "Proceed"]});
                            };

Dialog.chain("dialogs":[DialogGetBucketNoteType, 
                        DialogGetBucketNoteContent, 
                        DialogConfirmEmptyBucket, 
                        DialogEmptyBucket], 
             "onChainClose": handleDialogChainClose);
*/

var Dialog={
   
   INPUT_TEXT: 0,
   INPUT_TEXT_MULTILINE: 1, 
   INPUT_DROPDOWN: 2,
   
   _firstRun: true,
   
   _node: Style.setAttributes($E("div"), {"zIndex":"5001", "backgroundColor":"#FFF"}),
   
   Icons: {INFO: new Image(), ERROR: new Image(), WARNING: new Image()},
   
   // Inclusive handles everything. Period.
   // Arg nvps
   //   text
   //   buttons: array of button names
   //   icon
   //   hasInput
   //   multiline
   //   timeout: milliseconds that alert will be shown before closing automatically
   
   // Custom Events
   //    onClose     fired when dialog closes, also has possible attributes: button, value, and anything extended from eventData
   show: function(args)
         {
            if(Dialog._firstRun)
            {
               //Dialog._overlay=$E("div", {"class":"dialog_blackout", "style":"position:absolute; top:0px; left:0px; width:100%; height:1000px; background-color:#000; z-index:5000; opacity:.5; filter: alpha(opacity=50);"});
               
               Dialog._overlay=$E("table", {"class":"dialog_overlay", "style":"position:absolute; left:0px; width:100%; height:100%; z-index:5000; border-collapse:collapse;"});
               Dialog._node=$E("div", {"class":"dialog"});
               
               var tbody=$E("tbody"), 
                     tr1=$E("tr"), 
                     tr2=$E("tr"), 
                     tr3=$E("tr"), 
                     td, 
                     atts={"style":"background-color:#000; opacity:.5; filter: alpha(opacity=50);"};
               
               // First row
               tr1.appendChild($E("td", atts));
               tr1.appendChild($E("td", atts));
               tr1.appendChild($E("td", atts));
               
               // Second row
               tr2.appendChild($E("td", atts));
               var nC=$E("td", {"style":"width:1px; height:1px; padding:0px;"});
               nC.appendChild(Dialog._node);
               tr2.appendChild(nC);
               tr2.appendChild($E("td", atts));
               
               // Third row
               tr3.appendChild($E("td", atts));
               tr3.appendChild($E("td", atts));
               tr3.appendChild($E("td", atts));
               
               tbody.appendChild(tr1);
               tbody.appendChild(tr2);
               tbody.appendChild(tr3);
               
               Dialog._overlay.appendChild(tbody);
               
               if(!Object.keyExists(args, "node"))
               {
                  Dialog._titleContainerNode=$E("div", {"class":"dialog_title_container"});
                  Dialog._iconContainerNode=$E("div", {"class":"dialog_icon_container"});
                  Dialog._textContainerNode=$E("div", {"class":"dialog_text_container"});
                  Dialog._inputContainerNode=$E("div", {"class":"dialog_input_container"});
                  Dialog._buttonContainerNode=$E("div", {"class":"dialog_button_container button_container"});
                  
                  Dialog._node.appendChild(Dialog._titleContainerNode);
                  Dialog._node.appendChild(Dialog._iconContainerNode);
                  Dialog._node.appendChild(Dialog._textContainerNode);
                  Dialog._node.appendChild(Dialog._inputContainerNode);
                  Dialog._node.appendChild(Dialog._buttonContainerNode);
               }
               
               document.getElementsByTagName("body")[0].appendChild(Dialog._overlay);

               Dialog._firstRun=false;
            }
            
            // Reset
            Event.removeObservers(Dialog, "close");
            
            if(Browser.isIE)
            {
               Style.setAttributes(Dialog._overlay, {"display":"block", "top":(self.pageYOffset | document.documentElement.scrollTop | document.body.scrollTop) + "px"});
            }
            else
            {
               Style.setAttributes(Dialog._overlay, {"display":"table", "top":(self.pageYOffset | document.documentElement.scrollTop | document.body.scrollTop) + "px"});
            }
            
            if(Dialog._titleContainerNode)
            {
               Style.setAttributes(Dialog._titleContainerNode, {"display":"none"});
            }
            
            if(Dialog._iconContainerNode)
            {
               Style.setAttributes(Dialog._iconContainerNode, {"display":"none"});
            }
            
            if(Dialog._inputContainerNode)
            {
               Style.setAttributes(Dialog._inputContainerNode, {"display":"none"});
            }
            
            if(Dialog._buttonContainerNode)
            {
               Style.setAttributes(Dialog._buttonContainerNode, {"display":"none"});
            }
            
            // When showing the modal, shut down scrolling on the body
            Style.setAttributes(document.body, {"overflow":"hidden"});
            
            // Build input
            if(args.input==Dialog.INPUT_TEXT)
            {
               Dialog._input=$E("input", {"name":"dialog_input", "class":"dialog_input_singleline"});
            }
            else if(args.input==Dialog.INPUT_TEXT_MULTILINE)
            {
               Dialog._input=$E("textarea", {"name":"dialog_input", "class":"dialog_input_multiline"});
            }
            else if(args.input==Dialog.INPUT_DROPDOWN)
            {
               Dialog._input=$E("select", {"name":"dialog_input"});
               
               for(var i=0; i<args.options.length; i++)
               {
                  Dialog._input.options[Dialog._input.options.length]=(new Option(args.options[i][0], args.options[i][1]));
               }
            }
            
            //Dialog._input=(args.multiline ? $E("textarea", {"class":"dialog_input_multiline"}) : $E("input", {"class":"dialog_input_singleline"}));
            
            // Add listeners
            if(args.onBeforeClose)
            {
               Event.observe(Dialog, "beforeclose", args.onBeforeClose, (Object.keyExists(args, "beforeCloseEventData") ? args.beforeCloseEventData : {}));
            }
            
            if(Object.keyExists(args, "onClose"))
            {
               Event.observe(Dialog, "close", args.onClose, (Object.keyExists(args, "eventData") ? args.eventData : {}));
            }
            
            if(Object.keyExists(args, "onSuccess"))
            {
               Event.observe(Dialog, "success", args.onSuccess, (Object.keyExists(args, "eventData") ? args.eventData : {}));
            }
            
            if(Object.keyExists(args, "onError"))
            {
               Event.observe(Dialog, "error", args.onError, (Object.keyExists(args, "eventData") ? args.eventData : {}));
            }
            
            // Custom functionality is activated when the "view" or "html" attribute is present
            if(Object.keyExists(args, "view"))
            {
               Dialog._node.innerHTML="";

               Dialog._node.appendChild(args.view.getNode());
            }
            else if(Object.keyExists(args, "html"))
            {
               Dialog._node.innerHTML=args.html;
            }
            else
            {
               Dialog._titleContainerNode.innerHTML="";
               Dialog._iconContainerNode.innerHTML="";
               Dialog._textContainerNode.innerHTML="";
               Dialog._inputContainerNode.innerHTML="";
               Dialog._buttonContainerNode.innerHTML="";
               
               if(Object.keyExists(args, "content"))
               {
                  Dialog._node.innerHTML=args.content;
                  
                  Dialog._node.appendChild(Dialog._buttonContainerNode);
               }
               else
               {
                  if(Object.keyExists(args, "title"))
                  {
                     Dialog._titleContainerNode.innerHTML=args.title;
                     
                     Style.setAttributes(Dialog._titleContainerNode, {"display":"block"});
                  }
                  
                  // Handle icon
                  if(Object.keyExists(args, "icon"))
                  {
                     Dialog._iconContainerNode.appendChild(args.icon);
                     
                     Style.setAttributes(Dialog._iconContainerNode, {"display":"block"});
                  }
                  
                  // Handle text
                  Dialog._textContainerNode.innerHTML=args.text;
                  
                  // Handle input
                  if(Object.keyExists(args, "input"))
                  {
                     Dialog._inputContainerNode.appendChild(Dialog._input);
                     
                     Style.setAttributes(Dialog._inputContainerNode, {"display":"block"});
                  }
               }
               
               // Handle buttons
               if(Object.keyExists(args, "buttons"))
               {
                  for(var i=0; i<args.buttons.length; i++)
                  {
                     Dialog._buttonContainerNode.innerHTML+="<a href='javascript:Dialog.close(\"" + args.buttons[i] + "\");' class='dialog_button button'>" + args.buttons[i] + "</a>";
                  }
                  
                  Style.setAttributes(Dialog._buttonContainerNode, {"display":"block"});
               }
               
               // Handle timeout
               if(Object.keyExists(args, "timeout"))
               {
                  setTimeout(Dialog.close, args.timeout); 
               }
            }
         },
              
   close: function(button)
          {
             Event.fire(Dialog, "beforeclose", {"button":button});
          
             Style.setAttributes(Dialog._overlay, {"display":"none"});
             
             // When closing, set the scrolling back
             // When showing the modal, shut down scrolling on the body
             Style.setAttributes(document.body, {"overflow":"auto"});
             
             var value=$F("dialog_input");
             
             var button=(button ? button : "");
             
             Event.fire(Dialog, "close", {"value":value, "button":button});
             
             delete Dialog._input;
          }
   
};